开发者问题收集

Angular - 多选下拉列表 - TypeError:无法读取未定义的属性“长度”

2020-10-30
1688
counter: number = 0;
  getDatatypes(){
    if(this.counter == 0) {
      if(this.appId != 0)
      {
        if(undefined != this.datatypes && this.datatypes.length)
          for (let i = 0; i < this.datatypes.length; i++) {
            this.applicationDataType = new ApplicationDataType(this.route.snapshot.params.id, this.datatypes[i].dataTypeId, this.datatypes[i].description, false);
            let datatype = this.checkedDatatypes.find(y => y.description === this.datatypes[i].description);
            if (datatype) {
              this.applicationDataType.checked = true;
              this.applicationDataTypes.push(this.applicationDataType);
            } else {
              this.applicationDataType.checked = false;
              this.applicationDataTypes.push(this.applicationDataType);
            }
        }
      } else {
        for(let i = 0; i < this.datatypes.length; i++){
          this.applicationDataType = new ApplicationDataType(this.route.snapshot.params.id, this.datatypes[i].dataTypeId, this.datatypes[i].description, false);
          this.applicationDataTypes.push(this.applicationDataType);
        }
      }
      this.counter ++;
    }
  }

这一行

if(undefined != this.datatypes && this.datatypes.length)

给出了 TypeError: Cannot read property 'length' of undefined

这是我收到的控制台错误

enter image description here

这些错误对用户不可见,并且不会影响功能。我已经尝试了所有方法,但前端多选下拉列表中的数据类型总是消失。我尝试过初始化数据类型:Datatype[] = [],用 if(this.datatypes && this.datatypes.length) 包装我的 for 循环,并使用 ?。这些只会在运行前端时使多选下拉列表为空。

2个回答

看起来 this.datatypes 不是数组或为空,您可以使用 ? 忽略此错误。

请将其更改为 if(this.datatypes?.length>0)

Edison Augusthy
2020-10-30

您能否尝试如下操作?初始化 dataTypes 数组,然后用 forEach 替换 for 循环,如下所示

counter: number = 0;
  datatypes = [];
  getDatatypes(){
    if(this.counter == 0) {
      if(this.appId != 0)
      {
        this.datatypes.forEach(dtype => {
          this.applicationDataType = new ApplicationDataType(this.route.snapshot.params.id, dtype.dataTypeId, dtype.description, false);
            let datatype = this.checkedDatatypes.find(y => y.description === dtype.description);
            if (datatype) {
              this.applicationDataType.checked = true;
              this.applicationDataTypes.push(this.applicationDataType);
            } else {
              this.applicationDataType.checked = false;
              this.applicationDataTypes.push(this.applicationDataType);
            }
        })
      } else {
        this.datatypes.forEach(dtype => {
          this.applicationDataType = new ApplicationDataType(this.route.snapshot.params.id, dtype.dataTypeId, dtype.description, false);
          this.applicationDataTypes.push(this.applicationDataType);
        })
      }
      this.counter ++;
    }
  }
adhs91
2020-10-30