I am creating a simple filter pipe in my app , here is what I have .
过滤器组件:
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'dataFilter'
})
export class DataFilterPipe implements PipeTransform {
transform(value: any[], input: string) {
if (input) {
input = input.toLowerCase();
return value.filter(function (el: any[]) {
return el.toLowerCase().indexOf(input) > -1;
});
}
return value;
}
}
这是componet.html
<div class="card movies-list" id="movies-list">
<div class="card-header movies-list_header">
<h1>Content: <small>Best movies of 2010's</small></h1>
</div>
<div class="card-body">
<div class="row movies-list_filter">
<div class="col-md-2">Filter By</div>
<div class="col-md-4">
<input type='text' [(ngModel)]="listFilter">
</div>
</div>
<div class="row">
<div class="col-md-6">
<h1>filterdbY: {{listFilter}}</h1>
</div>
</div>
<table class="table table-striped table-responsive">
<thead>
<tr class="movies-list_tbheader">
<td></td>
<th>Title</th>
<th>Realease</th>
<th>Rating</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="movies-list_data" *ngFor="let movie of movies | dataFilter:listFilter">
<td>
<img *ngIf="movie.poster_path" class="thumbnail" src="http://image.tmdb.org/t/p/w500/{{movie.poster_path}}">
</td>
<td>{{ movie.title }}</td>
<td>{{ movie.release_date }}</td>
<td>{{movie.vote_average}}</td>
<td>{{movie.overview}}</td>
</tr>
</tbody>
</table>
</div>
</div>
在component.ts中,我已经这样声明了变量listFilter:
export class MoviesComponent implements OnInit {
listFilter = '';
-----------
}
当我运行我的应用并尝试查找一些文本时,出现以下错误
错误TypeError:el.toLowerCase不是函数
我的代码有什么问题?任何帮助将不胜感激
答案 0 :(得分:7)
使用管道过滤数据不被视为“最佳实践”。而是在您的组件中执行。例如:
// Local filter
performFilter(filterBy: string): IMovie[] {
if (filterBy) {
filterBy = filterBy.toLocaleLowerCase();
return this.movies.filter((movie: IMovie) =>
movie.title.toLocaleLowerCase().indexOf(filterBy) !== -1);
} else {
return this.movies;
}
}
我在此处有关于此的详细博客文章:https://blogs.msmvps.com/deborahk/filtering-in-angular/
详细说明了为什么不使用管道进行过滤以及执行上述过滤操作的几种不同技术。
顺便说一句...此代码看起来确实很熟悉。 :-)这是我OLD Angular v2的一次演讲中的代码...在团队通知我们之前,不建议以这种方式使用管道。
哦...,我在另一个答案中查看了您作为评论提供的链接(此链接已被删除),并且代码与您在上面发布的代码不同。这是您链接中的“有效”代码:
transform(value: IProduct[], filterBy: string): IProduct[] {
filterBy = filterBy ? filterBy.toLocaleLowerCase() : null;
return filterBy ? value.filter((product: IProduct) =>
product.productName.toLocaleLowerCase().indexOf(filterBy) !== -1) : value;
}
这是上面的代码:
transform(value: any[], input: string) {
if (input) {
input = input.toLowerCase();
return value.filter(function (el: any[]) { // <---- data type!
return el.toLowerCase().indexOf(input) > -1;
});
}
return value;
}
请注意,传递给过滤器函数的数据类型为any[]
。应该只是any
。