在为角度重新分配变量时得到null / undefined

时间:2018-10-29 15:29:19

标签: angular typescript

我有一个测试数组: test = null;

我已经创建了一个函数,并且正在将值重新分配给测试数组,尽管它表示空数组/未定义数组

abcd(){
    this.dataService.getAirport().subscribe(
      (data) => {
        this.airportData = data.data.data.metaDataRows;
        this.countryData = data.data.data.metaDataFields[0].column;
         const airConNames = this.countryData.values;
         this.test = [];
         this.test.push({name:'Select a Country', id:'0'});
         //this.test = [{name:'Select a Country', id:'0'}];
         console.log(this.test);
         airConNames.forEach(function(entry) {
           //console.log(entry.name);
           //console.log(entry.country_id);
          this.test = [{name : entry.name, id : entry.country_id}];
         });
        console.log(this.test); // this is null
      },
      (error) => {
        this.dataService.handleServiceError(error.message, this.TAG);
      }
    );
      console.log(this.test); //this is null
 }

控制台显示空值,

我要去哪里错了

2 个答案:

答案 0 :(得分:0)

有两件事,在foreach循环内,您每次都将this.test设置为一个新数组。您应该执行this.test.push()操作或使用rest参数this.test = [{ ... }, ...this.test];(取决于您是否想将其余部分放在末尾(不移位)或放在开头(推动)。

接下来,this上下文不是您所期望的,因为您正在使用airConNames.forEach(function(entry) { ... })。尝试使用箭头函数语法airConNames.forEach((entry) => {

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions

  

箭头函数表达式的语法比函数表达式短,并且没有自己的this,arguments,super或new.target。

不知道为什么this.test在foreach之后为null,这很奇怪。 试试:

this.test = airConNames.map(entry => ({ name: entry.name, id: entry.country_id }));
this.test.unshift({ name: 'Select a Country', id:'0' });

答案 1 :(得分:0)

 airConNames.forEach(function(entry) {
       //console.log(entry.name);
       //console.log(entry.country_id);
       // push new values into your test array:
      this.test.push({name : entry.name, id : entry.country_id});
     });
    console.log(this.test); // this is null
  },

for循环中的此上下文引用了forEach函数范围,这就是this.test与打印console.log的循环外的this.test不同的原因。

如果要确保它与上面声明的变量的实例相同,请使用粗箭头符号=>。 箭头函数表达式的语法比函数表达式短,并且没有自己的this,arguments,super或new.target。这些函数表达式最适合于非方法函数,因此不能用作构造函数。 例如:

airConNames.forEach((entry) => {
   //console.log(entry.name);
    //console.log(entry.country_id);
// push new values into your test array:
  this.test.push({name : entry.name, id : entry.country_id});

});

在此处查看有关箭头功能的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions