todoMVC_mvc框架是什么

2022-10-01 14:04:09 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

依赖css

代码语言:javascript复制
npm i todomvc-common todomvc-app-css

app.component.ts

代码语言:javascript复制
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

代码语言:javascript复制
<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

代码语言:javascript复制
/* 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

代码语言:javascript复制
"strict": false,

app.module.ts

代码语言:javascript复制
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.cn/194860.html原文链接:https://javaforall.cn

0 人点赞