データforEach()
内でthis.firms
を呼び出すにはどうすればよいですか?
私は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
コンテキストthis
は、forEach()
によって呼び出される匿名関数には挿入されません。 this
が未定義である理由です。
ES6の機能を使用している場合は、_arrow function
_を使用できます。関数内でコンテキストを保持するためです。
_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));
_
編集:
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);
_
data
を配列にしようとすることができます
そのようです :
Array.from(data).forEach((eachObj) => {
console.log("firms check!");
console.log(that.firms);
eachObj.name = that.firms[data.firmid - 1].name;
})
これも同様に機能します
これがjavascriptのスコープの基本的な例です。関数内でthis
は関数自体のコンテキストを参照します。外の世界にはアクセスできません。
angularでTypeScriptを使用しているため、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
});