前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >todoMVC_mvc框架是什么

todoMVC_mvc框架是什么

作者头像
全栈程序员站长
发布2022-10-01 14:04:09
7620
发布2022-10-01 14:04:09
举报
文章被收录于专栏:全栈程序员必看

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

依赖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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月11日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档