Как я могу вызвать 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
});