Angular 4 Ngx-datatable过滤器不工作的对象为空,但被访问(即使有条件)
我正在使用ngx-datatable,我试图为我的代码添加过滤器功能,但它根本不起作用。Angular 4 Ngx-datatable过滤器不工作的对象为空,但被访问(即使有条件)
这是我的代码:
import {Component, OnInit, ViewChild, ViewEncapsulation} from '@angular/core';
import {NavbarService} from '../../Services/navbar.service';
import {DataService} from '../../Services/data.service';
import {DatatableComponent} from '@swimlane/ngx-datatable';
import {forEach} from '@angular/router/src/utils/collection';
@Component({
selector: 'app-student',
templateUrl: './student.component.html',
styleUrls: ['./student.component.css'],
encapsulation: ViewEncapsulation.None
})
export class StudentComponent implements OnInit {
rows: Student[];
@ViewChild('myTable') table: any;
students: Student[];
temp = [];
constructor(private nav: NavbarService, public dataService: DataService) {
this.dataService.getStudents().subscribe(Students => {
this.Students = [...Students];
this.rows = Students;
});
}
ngOnInit() {
this.nav.show();
}
onPage(event: Event) {
clearTimeout(this.timeout);
this.timeout = setTimeout(() => {
console.log('paged!', event);
}, 100);
}
toggleExpandRow(row) {
console.log('Toggled Expand Row!', row);
this.table.rowDetail.toggleExpandRow(row);
}
onDetailToggle(event) {
console.log('Detail Toggled', event);
}
updateFilter(event) {
const val = event.target.value.toLowerCase();
this.rows = this.students.filter(row =>
row.AspNetUsers.Nom.toLowerCase().indexOf(val) !== -1 || !val
);
this.table.offset = 0;
}
}
像在文档代码,我要的功能添加到我的输入updateFilter
称取输入的值,然后有取决于过滤器临时数组的函数插入的值,但是这个函数根本不起作用我得到Cannot read property 'Name' of undefined
我使用控制台检查了它们的数组值,并调试它似乎数组是正确的,并有值,但我不知道为什么过滤器函数没有返回任何内容。我尝试添加尝试 - 赶上问题消失,但过滤功能没有过滤。
编辑:student.component.html的代码
<div class="container">
<div class="row">
<div class="col">
<form>
<div class="input-group">
<input class="form-control" id="search" name="search" (keyup)='updateFilter($event)' placeholder="Rechercher">
<div class="input-group-addon"><i class="material-icons">search</i></div>
</div>
</form>
</div>
</div>
<div class="row mt-3">
<div class="col">
<ngx-datatable
#myTable
class='material expandable'
[columnMode]="'force'"
[headerHeight]="50"
[footerHeight]="50"
[rowHeight]="50"
[rows]='rows'
[limit]="20"
(page)="onPage($event)">
<ngx-datatable-row-detail [rowHeight]="120" #myDetailRow (toggle)="onDetailToggle($event)">
<ng-template let-row="row" let-expanded="expanded" ngx-datatable-row-detail-template>
<div class="container">
<table class="table">
<tr>
<th>Email</th>
<td>{{row.AspNetUsers.Email}}</td>
</tr>
<tr>
<th>Adresse</th>
<td>{{row.ADRESSE}}</td>
</tr>
</table>
</div>
</ng-template>
</ngx-datatable-row-detail>
<ngx-datatable-column
[width]="50"
[resizeable]="false"
[sortable]="false"
[draggable]="false"
[canAutoResize]="false">
<ng-template let-row="row" let-expanded="expanded" ngx-datatable-cell-template>
<a
href="javascript:"
[class.datatable-icon-right]="!expanded"
[class.datatable-icon-down]="expanded"
title="Expand/Collapse Row"
(click)="toggleExpandRow(row)">
</a>
</ng-template>
</ngx-datatable-column>
<ngx-datatable-column name="ID" [width]="100">
<ng-template let-row="row" ngx-datatable-cell-template>
{{row.studentID}}
</ng-template>
</ngx-datatable-column>
<ngx-datatable-column name="First Name" [width]="100">
<ng-template let-row="row" ngx-datatable-cell-template>
{{row.AspNetUsers.Name}}
</ng-template>
</ngx-datatable-column>
<ngx-datatable-column name="Last Name" [width]="100">
<ng-template let-row="row" ngx-datatable-cell-template>
{{row.AspNetUsers.LastName}}
</ng-template>
</ngx-datatable-column>
<ngx-datatable-column name="Special Code" [width]="100">
<ng-template let-row="row" ngx-datatable-cell-template>
{{row.AspNetUsers.SpecialCode}}
</ng-template>
</ngx-datatable-column>
<ngx-datatable-column name="PhoneNumber" [width]="100">
<ng-template let-row="row" ngx-datatable-cell-template>
{{row.AspNetUsers.PhoneNumber}}
</ng-template>
</ngx-datatable-column>
</ngx-datatable>
</div>
</div>
</div>
编辑2: 我发现,为什么我得到的错误,有一些失踪的名字(他们是空)和过滤器内发生,如果问题它是空的。 我增加了学生!== null但仍然发生问题。
这显然是错误的HTML打破你的过滤。 把安全导航操作到像排的每一插补:
{{row.AspNetUsers?.Name}}
{{row.AspNetUsers?.SpecialCode}}
等。应该删除错误,以便您能够更深入地进行调试。
我已经尝试使用'row?.AspNetUsers?.Name'&yours这个解决方案,但它根本不工作,我仍然得到错误/请注意,使用try catch和normal for循环代码的工作没有问题。 – Noah13
@ Kareem13,这很奇怪,在你的代码中,我看到了逻辑试图到达'Name'属性的唯一地方。所以如果你能找到其他地方发生的事情,或者提供撬棍,那将是非常有用的。 – Mikki
是的,我知道,当我使用传统的循环,并尝试/赶上代码工作没有任何问题。另一件事,当我使用row.ADRESSE而不是row.AspNetUsers.Name我得到另一个错误'无法读取属性'tolowercase'的空',所以我不知道我真的不知道我确定对象有值,但无论我得到空或undefined – Noah13
请同时添加您的'students.component.html'代码,以便我们可以正确理解逻辑 – Mikki
感谢您的建议,我添加了students.component.html – Noah13
的代码'this.rows'过滤后?你可以在这行上面登录'this.rows' - this.table.offset = 0;'? – Mikki