Angular5无法读取未定义的属性“长度”

时间:2018-03-06 13:54:10

标签: javascript angular typescript angular5

你好我想显示一个用户数据列表,但是如果用户数据大于0则我已经设置了一个条件,然后显示*ngIf长度属性的帮助,所以当我使用它时我的问题就像Cannot read property 'length' of undefined那样得到错误,所以请任何人帮助我。
我也在angular2版本上显示相同的问题,但没有多大帮助。这是我的看法。

<div *ngIf="(studentListData | filter).length == 0">
   <h3>Sorry ..!data not found</h3>
</div>

<div *ngIf="(studentListData | filter | filter ).length > 0>
   <tr *ngFor="let student of studentListData | filtter; index as i;">
        // ** here is my td *//
   </tr>
</div>

在我的组件中

export class studentAllComponet implements OnInit {
  studentListData:any;

getStudentList(){
        let studentList = this.studentService.getAllStudents();
        this.success(studentList)
    }

success(data){
        this.studentListData = data;
        for (var i = 0; i < this.studentListData.length; i++) {
            this.studentListData[i].name = this.studentListData[i].first_name +' '+ this.studentListData[i].last_name;
        }
    }

}

在我的过滤器中

@Pipe({  name: 'filtter' })
export class FiltterPipe implements PipeTransform{
   transform(value: any, args?: any): any {
        if (args != undefined && args != null && args != '') {
            return value.filter(data => (data.name.toLowerCase()).indexOf(args.toLowerCase()) > -1);
        }
        return value;
    }
}

提前致谢..!

4 个答案:

答案 0 :(得分:1)

在您的模板中,您可以使用safe navigation operator&#39;?&#39;在属性访问之前,如果有一个对象,angular会检查你。我猜studentListData为null或未在模板渲染时定义。

<div *ngIf="(studentListData | filter)?.length == 0">
   <h3>Sorry ..!data not found</h3>
</div>

<div *ngIf="(studentListData | filter | filter )?.length > 0">
   <tr *ngFor="let student of studentListData | filtter; index as i;">
        // ** here is my td *//
   </tr>
</div>

答案 1 :(得分:0)

如果你的studentService返回一个observable,我会使用subscribe从中获取结果并在subscribe方法中操作结果:

getStudentList(){
  this.studentService
    .getAllStudents()
    .subscribe((data: any) => {
      data.forEach((d) => {
        d.name = d.first_name + ' ' + d.last_name
      })
      this.studentListData = data;
    });
}

答案 2 :(得分:0)

我认为,您只能在TypeSript中处理此问题。无需更改HTML代码。

在您的组件中,您可以检查studentList是否为空。

export class studentAllComponet implements OnInit {
studentListData:any;

getStudentList(){
let studentList = this.studentService.getAllStudents();
**if(studentList === undefined){
  alert('Student List is empty');
  return[];
}**
else{
    this.success(studentList)
    }
}

success(data){
    this.studentListData = data;
    for (var i = 0; i < this.studentListData.length; i++) {
        this.studentListData[i].name = this.studentListData[i].first_name +' '+ this.studentListData[i].last_name;
    }
}

}

现在您无需在HTML中使用任何过滤器。

答案 3 :(得分:0)

一个非常简单的解决方案:

在您的组件文件中,您可以使用这样的空数组初始化 studentListData

export class studentAllComponet implements OnInit {
    studentListData:any = [];

现在,这将解决 undefined 问题,因为您总是有一个数组,只是在开始时它是空的。

希望这会有所帮助。快乐编码:)

相关问题