最终效果图
实现功能:
1.在输入框中输入需要完成的事项,回车后添加事项到待办事项;
2.在每个事项的前面有个复选框可以用来勾选,未勾选的时候是待办事项,勾选后是已完成事项;
3.在每个事项的后面有一个按钮可以用于删除这个事项;
4.设置一点点样式让页面不是特别难看,左边是事项内容,右边是事项删除按钮。
5.刷新页面,待办事项和已完成事项不会消失。
创建组件与服务并启动项目
创建组件todoList
这个demo在angular手脚架里面进行搭建的,因此我们仍然使用angular完成这个demo。第一步就是创建组件并运行。components/todoList是创建生成的路径。
ng g component components/todoList
创建服务
服务可以实现了方法的共享。 终端命令输入
ng g service services/storage
在app.module.ts引入以及配置服务 在app.module.ts加入一下一句
import { StorageService } from './services/storage.service';
将providers: [],语句改为
providers: [StorageService],
然后在需要引用服务的组件(即todo-list.component.ts文件)加入引用语句,这里的路径按照实际路径写。
import { StorageService } from '../../services/storage.service';
在constructor中进行初始化,参数列表中引入public storage: StorageService
constructor(public storage: StorageService) { }
运行项目
运行以下命令,等待几秒后浏览器自动打开页面
ng serve --open
输入框
这里的输入框用上angular的双向绑定 [(ngModel)],绑定的值是keyWord。再给他一个回车事件(keyup)="doAdd($event)。
<input type="text" [(ngModel)]="keyWord" (keyup)="doAdd($event)">
数据可持续化服务
在storage.service.ts文件中,写一个set函数用于把数据写进缓存中,get函数把缓存里面的数据读出来。
setItem基础用法: window.localStorage.setItem(key,value);//设置指定key的数据(JSON格式)
对这个函数比较感兴趣的同学可以参考这篇文章:window.localStorage.setItem的理解与使用
set(key:string,value:any){
localStorage.setItem(key,JSON.stringify(value))
}
get(key:string) {
let temp = localStorage.getItem(key)
let str:string;
if(temp){
str = temp;
}else{
str = '[]'
}
return JSON.parse(str);
}
在页面声明周期初始化时,读取缓存。todo-list.component.ts文件中ngOnInit()函数里面进行读取缓存。
ngOnInit(): void {
let todolist = this.storage.get('todolist');
if (todolist) {
this.todoList = todolist;
}
}
输入框
页面代码
todo-list.component.html文件中,这里用双向绑定对输入值keyWord进行绑定,添加回车事件doAdd($event)。
<input type="text" [(ngModel)]="keyWord" (keyup)="doAdd($event)">
TS代码
todo-list.component.ts文件中,需要对keyWord属性进行定义,因为这些事项需要进行渲染,所以建立一个数组存储这些事项。
public keyWord: string = "";
public todoList: any[] = [];
用if (e.keyCode == 13) 这句代码的意思是,按下回车后把输入的内容进行处理。处理的过程首先是对输入的内容进行判断,校验输入的这个内容是否在事项列表中,如果存在就进行提示,如果不存在将这个事项附上初始状态0添加到事项列表中。添加到事项列表的这个数据是一个对象,里面包括事项名称和它的初始状态码。添加完成事项后将输入框内容清空。随后进行数据可持续操作。
doAdd(e: any) {
if (e.keyCode == 13) {
if (!this.todoListHasKeyword(this.todoList, this.keyWord)) {
this.todoList.push({
title: this.keyWord,
status: 0,
});
this.keyWord = ''
// 数据可持续化
this.storage.set('todolist',this.todoList)
}else{
alert('数据已经存在!')
}
}
}
对于这个校验单独拎出来写个todoListHasKeyword函数。传入事项列表与事项,返回这个新的事项是否在事项列表中存在。逻辑比较简单,遍历事项列表,如果列表中有就返回true,没有就返回false。
todoListHasKeyword(todoList: any, keyWord: any): boolean {
for (let item of todoList) {
if (item.title == keyWord) {
return true;
}
}
return false;
}
待办事项与已完成事项
页面代码
这个待办事项与已完成事项本质其实是一样的,是对事项列表进行循环选择性展示。
对列表进行循环:*ngFor="let item of todoList;let key = index"
对列表事项选择性展示:[hidden]="item.status == 1";当他们的状态码为1的时候进行隐藏。
对事项状态通过复选框进行改变:[(ngModel)]="item.status",与此同时加上一个改变事件的监视:(change)="changeData()" ,这是为了及时更新缓存。
按钮绑定事件进行删除:<button (click)="delData(key)">del
<h3>待办事项</h3>
<ul>
<li *ngFor="let item of todoList;let key = index" [hidden]="item.status == 1">
<input type="checkbox" name="" id="" [(ngModel)]="item.status" (change)="changeData()" >
{{item.title}} <button (click)="delData(key)">del</button>
</li>
</ul>
<h3>已完成事项</h3>
<ul>
<li *ngFor="let item of todoList;let key = index" [hidden]="item.status == 0">
<input type="checkbox" name="" id="" [(ngModel)]="item.status" >
{{item.title}} <button (click)="delData(key)">del</button>
</li>
</ul>
TS代码
删除函数: 这两行代码第一行是对事项在事项列表中进行删除,第二行是把数据写入缓存中。
delData(key: number) {
this.todoList.splice(key, 1)
this.storage.set('todolist',this.todoList)
}
修改函数:对缓存中的数据进行更新。
changeData(){
this.storage.set('todolist',this.todoList)
}
查看缓存
按“F12“是进入开发者工具