代码之家  ›  专栏  ›  技术社区  ›  Noah13

Angular 4 Ngx datatable Filter not working object为null,但已访问(即使有if条件)

  •  4
  • Noah13  · 技术社区  · 7 年前

    我正在使用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 我使用控制台检查了他们数组的值,并进行了调试。看起来数组是正确的,并且有值,但我不知道为什么过滤器函数什么都不返回。我试着添加try-catch,问题消失了,但过滤函数什么都不过滤。

    <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),在过滤器内部,如果为null,则会出现问题。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Kanso Code gildniy    7 年前

    这显然是HTML中的一个错误,它破坏了您的过滤。

    {{row.AspNetUsers?.Name}}
    {{row.AspNetUsers?.SpecialCode}}