Angular2 forEach can not read свойство

Как я могу вызвать this.firms в данных forEach()?

Я знаю, как это сделать в Angular1, но не с моим текущим проектом в Angular 2.

В настоящее время он отлично работает за пределами forEach, но не внутри.

 console.log(this.firms[0].name); // works
    var a = 0;
        console.log("--------------");

    data.forEach(function (eachObj) {
      console.log("firms check!");
      console.log(this.firms); // not working
      a = a + eachObj.income; 
      eachObj.name = this.firms[data.firmid - 1].name; // wont work
    });

Ошибка:

Cannot read property 'firms' of undefined

Ответ 1

Контекст this не вводится в анонимную функцию, вызываемую forEach(). Поэтому this undefined.

Вы можете использовать arrow function, если используете функции ES6, поскольку он сохраняет контекст в функции:

data.forEach(eachObj => {
  console.log("firms check!");
  console.log(this.firms);
  a = a + eachObj.income; 
  eachObj.name = this.firms[data.firmid - 1].name;
});

Или просто привяжите контекст напрямую:

data.forEach(function (eachObj) {
  console.log("firms check!");
  console.log(this.firms);
  a = a + eachObj.income; 
  eachObj.name = this.firms[data.firmid - 1].name;
}.bind(this));

Edit

Как упоминалось zeroflagL, вы можете просто передать контекст в forEach():

data.forEach(function (eachObj) {
  console.log("firms check!");
  console.log(this.firms);
  a = a + eachObj.income; 
  eachObj.name = this.firms[data.firmid - 1].name;
}, this);

Ответ 2

Вы можете попробовать сделать data и массив

так:

Array.from(data).forEach((eachObj) => {
    console.log("firms check!"); 
    console.log(that.firms);
    eachObj.name = that.firms[data.firmid - 1].name;
})

Это также будет работать

Ответ 3

Это основной пример области видимости в javascript. Внутри вашей функции this относится к контексту самой функции. Внешний мир недоступен.

Поскольку вы используете Typescript с angular, вы можете просто использовать arrow function:

data.forEach((eachObj) => {
  console.log("firms check!");
  console.log(this.firms); // not working
  a = a + eachObj.income; 
  eachObj.name = this.firms[data.firmid - 1].name; // wont work
});

Это сохранит область действия, и ваш this будет доступен внутри него. В простом javascript вы можете сделать что-то вроде этого:

var that = this;

data.forEach(function (eachObj) {
  console.log("firms check!");
  console.log(that.firms); // not working
  a = a + eachObj.income; 
  eachObj.name = that.firms[data.firmid - 1].name; // wont work
});