Angular 自定义管道不工作
Angular Custom Pipe not working
我为我的项目创建了一个自定义管道,并将我的管道文件包含在我的模块中的声明数组中。
搜索-user.pipe.ts
import { Pipe, PipeTransform } from '@angular/core';
import {
User
} from './user';
@Pipe({
name: 'searchUser'
})
export class SearchUserPipe implements PipeTransform {
constructor() {
console.log('imported');
}
transform(items: User[], filter: User): User[] {
console.log('inside transform');
if (!items || !filter) {
return items;
}
return items.filter((item: User) => this.applyFilter(item, filter));
}
applyFilter(user: User, filter: User): boolean {
for (const field in filter) {
if (filter[field]) {
if (typeof filter[field] === 'string') {
if (user[field].toLowerCase().indexOf(filter[field].toLowerCase()) === -1) {
return false;
}
} else if (typeof filter[field] === 'number') {
if (user[field] !== filter[field]) {
return false;
}
}
}
}
return true;
}
}
我在pipe.ts
中使用的用户模型
export class User {
studentId: Number;
name: String;
email: String;
phoneNumber: String;
}
这是我的 html 文件,我需要在其中使用管道对数据进行排序
<div *ngIf="dataLoaded" class="table-responsive">
<table #myTable class="table">
<thead>
<tr>
<th><input type="text" name="title" [(ngModel)]="filter.studentId" placeholder="ID"></th>
<th><input type="text" name="title" [(ngModel)]="filter.name" placeholder="NAME"></th>
<th><input type="text" name="title" [(ngModel)]="filter.email" placeholder="EMAIL"></th>
<th><input type="text" name="title" [(ngModel)]="filter.phoneNumber" placeholder="PHONE NUMBER"></th>
</tr>
</thead>
<tbody>
<tr id={{i}} *ngFor="let user of userDetails;let i of index | searchUser: filter">
<td>{{user.studentId}}</td>
<td>{{user.name}}</td>
<td>{{user.email}}</td>
<td>{{user.phoneNumber}}</td>
</tr>
</tbody>
</table>
</div>
我正在尝试为 table 的每一列创建过滤器。
我还通过将某些内容记录到文件的构造函数中来检查我的管道文件是否已导入到我的包中。
我被困在这里,管道对任何字段都不起作用。
我认为您在 html 中使用了错误的语法 ngFor。试试这个
*ngFor="let user of userDetails | searchUser: filter; index as i;">
我为我的项目创建了一个自定义管道,并将我的管道文件包含在我的模块中的声明数组中。
搜索-user.pipe.ts
import { Pipe, PipeTransform } from '@angular/core';
import {
User
} from './user';
@Pipe({
name: 'searchUser'
})
export class SearchUserPipe implements PipeTransform {
constructor() {
console.log('imported');
}
transform(items: User[], filter: User): User[] {
console.log('inside transform');
if (!items || !filter) {
return items;
}
return items.filter((item: User) => this.applyFilter(item, filter));
}
applyFilter(user: User, filter: User): boolean {
for (const field in filter) {
if (filter[field]) {
if (typeof filter[field] === 'string') {
if (user[field].toLowerCase().indexOf(filter[field].toLowerCase()) === -1) {
return false;
}
} else if (typeof filter[field] === 'number') {
if (user[field] !== filter[field]) {
return false;
}
}
}
}
return true;
}
}
我在pipe.ts
中使用的用户模型export class User {
studentId: Number;
name: String;
email: String;
phoneNumber: String;
}
这是我的 html 文件,我需要在其中使用管道对数据进行排序
<div *ngIf="dataLoaded" class="table-responsive">
<table #myTable class="table">
<thead>
<tr>
<th><input type="text" name="title" [(ngModel)]="filter.studentId" placeholder="ID"></th>
<th><input type="text" name="title" [(ngModel)]="filter.name" placeholder="NAME"></th>
<th><input type="text" name="title" [(ngModel)]="filter.email" placeholder="EMAIL"></th>
<th><input type="text" name="title" [(ngModel)]="filter.phoneNumber" placeholder="PHONE NUMBER"></th>
</tr>
</thead>
<tbody>
<tr id={{i}} *ngFor="let user of userDetails;let i of index | searchUser: filter">
<td>{{user.studentId}}</td>
<td>{{user.name}}</td>
<td>{{user.email}}</td>
<td>{{user.phoneNumber}}</td>
</tr>
</tbody>
</table>
</div>
我正在尝试为 table 的每一列创建过滤器。 我还通过将某些内容记录到文件的构造函数中来检查我的管道文件是否已导入到我的包中。
我被困在这里,管道对任何字段都不起作用。
我认为您在 html 中使用了错误的语法 ngFor。试试这个
*ngFor="let user of userDetails | searchUser: filter; index as i;">