2017-09-04 2 views
4

ngx-datatable을 사용하고 있으며 필터 기능을 제 코드에 추가하려고했지만 전혀 작동하지 않습니다. 각도 4 Ngx-datatable 필터가 작동하지 않는 개체는 null이지만 액세스 할 수 있습니다 (조건이있는 경우에도 사용)

내 코드입니다 : 문서의 코드처럼

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; 
    } 
} 

, I는 입력 값을 다음 필터 잠정 배열에 따라 기능이 내 입력 updateFilter에 기능을 추가해야 삽입 된 값이지만이 함수는 전혀 작동하지 않습니다. Cannot read property 'Name' of undefined 콘솔을 사용하여 배열의 값을 확인하고 배열이 정확하고 값이 있지만 디버그 함수가 아무 것도 반환하지 않는 이유를 모르겠습니다. try-catch 문제를 사라지려고했지만 필터 함수는 아무것도 필터링하지 않습니다.

편집 : 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 인) 및 필터 내부에 문제가있는 경우 발생 그것은 null입니다. student! == null을 추가했지만 여전히 문제가 발생합니다.

+0

또한 'students.component.html' 코드를 추가하십시오. 그러면 로직을 제대로 이해할 수 있습니다. – Mikki

+1

제안 해 주셔서 감사합니다. students.component.html 코드를 추가했습니다. – Noah13

+0

'this.rows'의 값은 무엇입니까? 필터링 후? 이 줄 위에'this.rows'를 기록 할 수 있습니까?'this.table.offset = 0;'? – Mikki

답변

0

분명히 HTML에서 필터링을 위반하는 오류입니다. 그래서

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

: 그리고 같은 행의 각 보간에 안전한 탐색 연산자를 넣어. 오류를 제거해야하므로 더 깊이 디버깅 할 수 있습니다.

+0

나는이 솔루션을'row? .AspNetUsers? .Name'과 당신의 코드를 사용하여 이미 시도했지만, 전혀 작동하지 않습니다./문제를 일으키지 않고 코드 잡아 먹음과 정상적인 루프를 사용한다는 점에 유의하십시오. – Noah13

+0

@ Kareem13, 그건 이상한데, 당신의 코드에서 로직이 무언가의 'Name'속성에 도달하려고하는 유일한 곳을 보았습니다. 그래서 다른 일이 어디서 일어 났는지를 알 수 있거나 플 런커를 제공한다면 매우 유용 할 것입니다. – Mikki

+0

예, 알고 싶습니다. 전통적인 for 루프를 사용하고 코드를 잡으려고해도 문제없이 작동합니다. row.AspNetUsers.Name 대신 row.ADRESSE를 사용할 때 또 다른 오류가 발생합니다. '객체를 읽을 수 없습니다'tolowercase 'of null'을 반환하므로 객체에 값이 있지만 null 또는 정의되지 않은 코드 – Noah13