todoMVC_mvc框架是什么

todoMVC_mvc框架是什么依赖cssnpmitodomvc-commontodomvc-app-cssapp.component.tsimport{Component}from’@angular/core’;consttodos=[{id:1,title:’吃饭’,done:true},{id:1,title:’工作’,done:false},{id:1,title:’运动’,

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

依赖css

npm i todomvc-common todomvc-app-css

app.component.ts

import { 
   Component} from '@angular/core';


const todos = [
  { 
   
    id: 1,
    title: '吃饭',
    done: true
  },
  { 
   
    id: 1,
    title: '工作',
    done: false
  },
  { 
   
    id: 1,
    title: '运动',
    done: true
  }
]


@Component({ 
   
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent { 
   
  h_title = 'todo-angular';
  public todos: { 
   
    id: number,
    title: string,
    done: boolean
  }[] = JSON.parse( window.localStorage.getItem('todos') || '[]');
  // 该函数是一个特殊的angular生命周期钩子函数
  // 它会在angular应用初始话的时候执行一次
  ngOnInit() { 
   
    window.onhashchange = () => { 
   
      this.hashChangeHandler()
      // 当用户点击了锚点的时候,我们需要获取当前的锚点标识
      // 然后动态的将根组件visibility设置为当前点击的锚点标识
      //注意 bind ,不然的话this就变成window了
      window.onhashchange = this.hashChangeHandler.bind(this)
    }
  }

  // 当angular组件数据发生改变的时候,ngDoCheck钩子被触发
  // 在钩子函数中持久化数据
  ngDoCheck(){ 
   
    window.localStorage.setItem('todos', JSON.stringify(this.todos))
  }
  public currentEditing: { 
   
    id: number,
    title: string,
    done: boolean
  } = null
// 实现导航切换数据过滤
// 1. 提供一个属性,该属性会根据当前点击的连接返回过滤后的数据 filterTodos
// 2. 提供一个属性,用来存储当前点击的连接标识 visibility all active completed
// 3. 为连接提供点击事件,当点击导航链接的时候,改变
//
  public visibility: string = 'all'

  get filterTodos() { 
   
    if (this.visibility === 'all') { 
   
      return this.todos
    } else if (this.visibility === 'active') { 
   
      return this.todos.filter((t => !t.done))
    } else if (this.visibility === 'completed') { 
   
      return this.todos.filter(t => t.done)
    }
    return null
  }

  addTodo(e): void { 
   
    const titleText = e.target.value
    if (!titleText.length) { 
   
      return
    }
    const last = this.todos[this.todos.length - 1]
    this.todos.push({ 
   
      id: last ? last.id + 1 : 1,
      title: titleText,
      done: false
    })
    e.target.value = ''
  }

  get toggleAll() { 
   
    return this.todos.every(t => t.done)
  }

  set toggleAll(val) { 
   
    this.todos.forEach(t => t.done = val)
  }

  removeTodo(index: number) { 
   
    this.todos.splice(index, 1)
  }

  saveEdit(todo, e) { 
   
    this.currentEditing = null
    todo.title = e.target.value
  }

  handleEditUp(e) { 
   
    const { 
   keyCode, target} = e
    if (keyCode === 27) { 
   
      target.value = this.currentEditing.title
      this.currentEditing = null
    }
  }

  get remainingCount() { 
   
    return this.todos.filter(t => !t.done).length
  }

  hashChangeHandler(){ 
   
    const hash = window.location.hash.substr(1)
    switch (hash) { 
   
      case '/':
        this.visibility = 'all'
        break;
      case '/active':
        this.visibility = 'active'
        break;
      case '/completed':
        this.visibility = 'completed'
        break;
    }
  }

  //清除所有
  clearAllDone() { 
   
    this.todos = this.todos.filter(t => !t.done)
  }
}



app.component.html

<section class="todoapp" ng-app="">
  <header class="header">
    <h1>待办事项</h1>
    <input class="new-todo" placeholder="What needs to be done?" autofocus (keyup.enter)="addTodo($event)" >
  </header>
  <!-- This section should be hidden by default and shown when there are todos -->
  <section class="main" *ngIf="todos.length">
    <input id="toggle-all" class="toggle-all" type="checkbox" [checked]="toggleAll">
    <!-- (change)="toggleAll = $event.target.checked"-->
    <!-- [checked]="toggleAll">-->
    <label for="toggle-all">Mark all as complete</label>
    <ul class="todo-list">
      <!-- These are here just to show the structure of the list items -->
      <!-- List items should get the class `editing` when editing and `completed` when marked as completed -->
      <li *ngFor="let todo of filterTodos; let i = index;" [ngClass]="{ editing: currentEditing === todo, completed: todo.done }">
        <div class="view">
          <input class="toggle" type="checkbox" [(ngModel)]="todo.done">
          <label (dblclick)="currentEditing = todo">{
  
  { todo.title }}</label>
          <button class="destroy" (click)="removeTodo(i)"></button>
        </div>
        <input class="edit" [value]="todo.title" (keyup.enter)="saveEdit(todo, $event)" (keyup)="handleEditUp($event)" (blur)="saveEdit(todo, $event)">
      </li>
    </ul>
  </section>
  <!-- This footer should be hidden by default and shown when there are todos -->
  <footer class="footer" *ngIf="todos.length">
    <!-- This should be `0 items left` by default -->
    <span class="todo-count"><strong>{
  
  {remainingCount}}</strong> item left</span>
    <!-- Remove this if you don't implement routing -->
    <ul class="filters">
      <li>
        <a [ngClass]="{ selected: visibility === 'all' }" href="#/">All</a>
      </li>
      <li>
        <a [ngClass]="{ selected: visibility === 'active' }" href="#/active">Active</a>
      </li>
      <li>
        <a [ngClass]="{ selected: visibility === 'completed' }" href="#/completed">Completed</a>
      </li>
    </ul>
    <!-- Hidden if no completed items are left ↓ -->
    <button (click)="clearAllDone()" class="clear-completed">Clear completed
    </button>
  </footer>
</section>

style.css

/* You can add global styles to this file, and also import other style files */
@import url('~todomvc-common/base.css');
@import url('~todomvc-app-css/index.css');

tsconfig.json

"strict": false,

app.module.ts

import { 
    NgModule } from '@angular/core';
import { 
    BrowserModule } from '@angular/platform-browser';
import { 
   FormsModule} from "@angular/forms";
import { 
    AppComponent } from './app.component';

@NgModule({ 
   
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    FormsModule
  ],
  providers: [],
  bootstrap: [AppComponent]
}) export class AppModule { 
    }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/194860.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 电子合同印章生成_全程电子化怎么打印章程

    电子合同印章生成_全程电子化怎么打印章程安装composerrequiretecnickcom/tcpdf示例代码try{$order=requestAPI(env(‘A2_URL’).’akinst/order/detail’,[‘user_id’=>Auth::id(),’order_number’=>$request->get(‘p’)]);$data=Arr::get($order,’0′,[]);$data[‘total_amount_ch’]=

    2025年8月28日
    5
  • ts切片文件的合并

    ts切片文件的合并https://www.icourse163.org/中国大学MOOC的课程经历了几个变化:Adobe的FLASH格式(*.flv)逐渐替换为H5格式的(*.mp4),然后由于监管趋严,有些课程找不到了。比如我想下一期再看的《加密与解密》的课程就找不到了!使用方法一:ts视频合并工具(tsMergertools)v1.0.0….

    2022年4月3日
    44
  • ubuntu的source命令_ubuntu installation type

    ubuntu的source命令_ubuntu installation typeGPGerror:No_PUBKEY

    2022年10月13日
    5
  • Java中的BufferedReader与BufferedWriter简介与使用

    Java中的BufferedReader与BufferedWriter简介与使用BufferedReader和BufferedWriter是带有默认缓冲区的字符输入输出流,其效率相较于没有缓冲区要高:   1.java.io.BufferedReader和java.io.BufferedWriter类各拥有8192字符的缓冲区。当BufferedReader在读取文本文件时,会先尽量从文件中读入字符数据并置入缓冲区,而之后若使用read()方法,会先从缓冲区中进行读取。…

    2022年5月4日
    44
  • 国产Linux系统下替代QQ和微信的不二之选

    国产Linux系统下替代QQ和微信的不二之选在2019年,UOS宣布成立至今,原深度系统得到资金之后,发展速度直线上升,目前已经完全可以使用Deepin系统进行办公和日常使用了UOS是Deepin的专业版,前者收费,后者免费,和红帽一样的运营策略但是,众所周知,在去年QQ迎来了距离上一次更新十年前后的第一次更新,更新效果一如既往的被吐槽,因为真的太敷衍了,而微信至今为止,并未有过真正的Linux平台的cs客户端,有的只是一个残废的网页封装版,所以如果使用国产系统去使用腾讯家族的东西,那将是一种折磨。幸好,互联网新秀字节跳动退出了覆盖全国产.

    2022年5月16日
    72
  • Maven配置阿里云仓库下载依赖「建议收藏」

    Maven配置阿里云仓库下载依赖「建议收藏」用过Maven的都知道Maven的方便便捷,但由于某些网络原因,访问国外的Maven仓库不便捷,maven默认使用的是国外的中央仓库,下载jar时有时候会因为网络不好等原因下载不全或失败,好在国内像阿里云、网易、JBoos、开源中国等大厂搭建了国内的maven仓库,阿里云的maven仓库使用的比较多:需要使用的话,要在maven的settings.xml文件里配置mirrors的子节点,添加…

    2022年6月22日
    97

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号