いくつかのTypeScriptコードを書いて、配列を繰り返しています。ループ内で、「this」オブジェクトにアクセスして、次のような処理を実行しようとしています。
console.log('before iterate, this = ' +this);
myarray.days.forEach(function(obj, index) {
console.log('before transform, this : ' + this);
this.datePipe.transform...
});
「this」は未定義であると文句を言うので、これは失敗します。「this」オブジェクトはループの前/外で[object object]として正しく印刷されますが、ループ内では未定義です。何故ですか?そして、それに対する修正は何ですか?
矢印関数 を使用する必要があります:
myarray.days.forEach((obj, index) => {
console.log('before transform, this : ' + this);
this.datePipe.transform...
});
または bind method を使用します。
myarray.days.forEach(function(obj, index) {
console.log('before transform, this : ' + this);
this.datePipe.transform...
}.bind(this));
その理由は、通常の関数をコールバックとして渡すとき、呼び出されたときにthis
が実際に保存されないためです。
上で述べた2つの方法は、関数の将来の実行のために正しいthis
スコープが保持されることを保証します。
this
をコールバックのパラメーターとして追加します。
}.bind(this));
の代わりに}, this);
を追加すると、Angularの問題が解決されるはずです。
したがって、次のようになります。
myarray.days.forEach(function(obj, index) {
console.log('before transform, this : ' + this);
this.datePipe.transform...
}, this);
これを試して:
myarray.days.forEach( (obj) => {
console.log('before transform, this : ' + this);
this.datePipe.transform...
});