无法读取未定义的试图将信息推入对象的属性“推”

时间:2019-05-23 15:31:23

标签: javascript angular typescript

I am trying to add information to an object but I am getting an error (saying that property 'push' of undefined).

/*This is my object model:*/

export class Students {
  city: string;
  company: string;
  email: string;
  firstName: string;
  grades: [];
  id: string;
  lastName: string;
  pic: string;
  skill: string;
  open: boolean;
  tags: string[];
}

已过滤学生:学生[];

/*I have a form that gets the information user is typing.
f has the information and index_ has the index of the object.*/

sendForm(f:NgForm,index_:数字){

    if (f.invalid) {
      return
    }
    else {
/*storing the value of user input into "str variable"*/
      var str = f.value.inputTag;

/*Here is where the error happens. I am trying to store information into "tags" property of a specific student.*/
      this.filteredStudents[index_].tags.push(str);
    }
    f.reset();
  }

如果您有任何想法,请帮助我! 如果您有任何想法,请帮助我! 如果您有任何想法,请帮助我!

此错误显示在Google chrome的控制台中。

3 个答案:

答案 0 :(得分:1)

我认为是因为在任何地方都没有定义this.filteredStudents,所以您需要将其声明为带有键“ tags”的哈希,并将值声明为控制器顶部某个位置的列表。

this.filteredStudents = {
     tags: []
}

那应该让你做 this.filteredStudents[tags].push('whatever').

在索引末尾加上_也有点奇怪。我已经看到内部函数的名称以_开头,而在函数参数末尾还没有使用过它。

答案 1 :(得分:1)

您应该更新此内容:

  export class Students {
    ...
    tags = new Array<string>();
  }

因为标签:string []这没有定义类型。

您必须记住,Angular Style Guide当前实际上是在说:“考虑对数据模型使用接口。”

在这种情况下,您可以执行以下操作:

export interface Students {
    ...
    tags: string[];
}

您可以这样使用它,例如:

    test: Students[] = new Array<Students>();

    const a = { city: 'My City', ..., tags: new Array<string>() };
    this.test.push( a );
    this.test[0].tags.push('Any string');

答案 2 :(得分:0)

这是一种无需修改类即可实现的方法

(this.filteredStudents[index_].tags = this.filteredStudents[index_].tags || []).push(str)

或者您可以初始化数组标签

 export class Students {
          ...
          skill: string;
          open: boolean;
          tags = new Array<string>();
        }

然后

this.filteredStudents[index_].tags.push(str)