javascript - 过滤谓词函数不返回任何内容并且无法读取属性“数据” - MatTableDataSource 角度
问题描述
当我们在搜索栏中输入第一个字母时,下面的函数第一次不起作用,它在数组中没有返回任何内容,后来当我们删除字母并继续输入时,它工作正常。
createFilterPredicate() {
let myFilterPredicate = function(data:any, filter:string): boolean {
console.log('data:', data);
let searchString = JSON.parse(filter);
return data.admissionno.toString().trim().indexOf(searchString.admissionno) !== -1 &&
data.firstname.toString().trim().toLowerCase().indexOf(searchString.firstname.toLowerCase()) !== -1;
}
return myFilterPredicate;
}
实际上,当我调试时,我看到它正在进入函数。之后它没有进入myFilterPredicate
函数并且控制台中没有数据并且什么都不返回。什么问题以及如何找到它?
完整代码如下:
ngOnInit(): void {
this.admissionNoFilter.valueChanges.subscribe((admissionno) => {
this.filteredValues['admissionno'] = admissionno;
this.dataSource.filter = JSON.stringify(this.filteredValues);
});
this.studentNameFilter.valueChanges.subscribe((firstname) =>{
this.filteredValues['firstname'] = firstname;
this.dataSource.filter = JSON.stringify(this.filteredValues);
});
this.dataSource.filterPredicate = this.createFilterPredicate();
}
createFilterPredicate() {
let myFilterPredicate = function(data:any, filter:string): boolean {
console.log('data:', data);
let searchString = JSON.parse(filter);
return data.admissionno.toString().trim().indexOf(searchString.admissionno) !== -1 &&
data.firstname.toString().trim().toLowerCase().indexOf(searchString.firstname.toLowerCase()) !== -1;
}
return myFilterPredicate;
}
组件.html
<table mat-table [dataSource]="dataSource" matSort>
<ng-container matColumnDef="admissionno">
<th mat-header-cell *matHeaderCellDef> <Strong> Admission No </Strong>
<div>
<mat-form-field>
<input matInput class="form-field" [formControl]="admissionNoFilter" placeholder="Filter">
</mat-form-field>
</div>
</th>
<td mat-cell *matCellDef="let element"> {{element.admissionno}} </td>
</ng-container>
<ng-container matColumnDef="firstname">
<th mat-header-cell *matHeaderCellDef > <Strong> Student Name </Strong>
<div>
<mat-form-field>
<input matInput class="form-field" [formControl]="studentNameFilter" placeholder="Name Filter">
</mat-form-field>
</div>
</th>
<td mat-cell *matCellDef="let element"> {{element.firstname + ' ' + element.lastname}} </td>
</ng-container>
</table>
解决方案
这里的问题是,一旦您的函数调用返回,您的 let 属性就会被破坏。
将创建过滤谓词更改为:-
createFilterPredicate(data:any, filter:string) {
console.log('data:', data);
let searchString = JSON.parse(filter);
return data.admissionno.toString().trim().indexOf(searchString.admissionno) !== -1 &&
data.firstname.toString().trim().toLowerCase().indexOf(searchString.firstname.toLowerCase()) !== -1;
}
并将其分配给数据源,例如:-
this.dataSource.filterPredicate = this.createFilterPredicate;
推荐阅读
- terraform - Terraform,ElasticSearch:无法访问此站点
- java - 如何在 JAVA 中通过命令行读取文件?
- python - 在 python 中使用 while 和 elif 语句有几个错误
- xml - 加载,修改,然后保存 testng-results.xml
- c# - 如何在 Windows uwp 应用程序上使用 Iot.Device.Bindings nuget 包?
- mysql - MYSQL 使用 TIME_FORMAT 将时间四舍五入到最近的小时,12 小时,但错误地将 AM 应用于所有内容
- python - pyodbc 和 sqlite3 的区别
- javascript - 如何在角度中使用带有复杂json的ngFor来渲染ul li数据
- javascript - JS:除了网络请求,什么时候使用 Promise?
- javascript - Firebase 的实时数据库事件侦听器的处理程序无限执行自身