【发布时间】:2016-03-31 02:43:21
【问题描述】:
在这种情况下,我使用ngFor 向视图显示学生列表(数组):
<li *ngFor="#student of students">{{student.name}}</li>
每当我将其他学生添加到列表中时,它都会更新,这真是太好了。
但是,当我给它一个 pipe 到 filter 的学生姓名时,
<li *ngFor="#student of students | sortByName:queryElem.value ">{{student.name}}</li>
在我在过滤学生姓名字段中输入内容之前,它不会更新列表。
这是plnkr的链接。
Hello_world.html
<h1>Students:</h1>
<label for="newStudentName"></label>
<input type="text" name="newStudentName" placeholder="newStudentName" #newStudentElem>
<button (click)="addNewStudent(newStudentElem.value)">Add New Student</button>
<br>
<input type="text" placeholder="Search" #queryElem (keyup)="0">
<ul>
<li *ngFor="#student of students | sortByName:queryElem.value ">{{student.name}}</li>
</ul>
sort_by_name_pipe.ts
import {Pipe} from 'angular2/core';
@Pipe({
name: 'sortByName'
})
export class SortByNamePipe {
transform(value, [queryString]) {
// console.log(value, queryString);
return value.filter((student) => new RegExp(queryString).test(student.name))
// return value;
}
}
【问题讨论】:
-
在你的管道中添加
pure:false,在你的组件中添加changeDetection: ChangeDetectionStrategy.OnPush。 -
谢谢@EricMartinez。有用。但是你能解释一下吗?
-
另外,我建议不要在您的过滤功能中使用
.test()。这是因为,如果用户输入一个包含特殊含义字符的字符串,例如:*或+等,您的代码将会中断。我认为您应该使用.includes()或使用自定义函数转义查询字符串。 -
添加
pure:false并使您的管道有状态将解决此问题。不需要修改 ChangeDetectionStrategy。 -
对于任何阅读本文的人来说,Angular Pipes 的文档已经变得更好,并且涵盖了这里讨论的许多相同内容。 Check it out.
标签: angular angular2-template angular2-directives angular-pipe