これは、私がこれまでに読んだ他のすべてのスコーピングの質問とほとんど同じですが、この質問をするのに関連性がある (imo) 1 つのわずかな違いを除いては.this
もともと私の問題はthis
、Knockout と Typescript を使用したスコーピングだったので、次のようになります。
class ViewModel
{
public SomeObservableArray = new ko.observableArray();
public AddToTheObservableArray(someJsonData: any)
{
this.SomeObservableArray.push(new SomePojo(someJsonData));
}
}
したがって、this
上記のコードのビットは、Typescript がクラス インスタンスであると考えさせるため、爆発しthis
ますが、実際には、this
キーワードをオーバーライドするシナリオが何であれ、ajax コールバックまたはビュー要素のために、これは別のものです。
それを修正するには、ほとんどの解決策はそのコードをクラスのコンストラクターに移動することです。これは個人的には恐ろしいことですが、TypeScript を使用することで得られる他の利点を考えると、このわずかな恐怖は受け入れられます。ですから、私たち全員が同じページにいるように、以下のコードは上記の問題を修正します:
class ViewModel
{
public SomeObservableArray = new ko.observableArray();
public AddToTheObservableArray = (someJsonData: any) => Void;
constructor
{
this.AddToTheObservableArray = (someJsonData: any) => {
this.SomeObservableArray.push(new SomePojo(someJsonData));
};
}
}
このサンプルコードは頭の中で書いているだけなので、タイプミスなどはお詫びしますが、直面する一般的な問題と一般的な解決策/回避策を強調しています.
今!私が抱えている問題は、ここからの次のステップです。次のようなコードがあります。
class ViewModel
{
public SomeObservableArray = new ko.observableArray();
public AddToTheObservableArray = (someJsonData: any) => Void;
constructor
{
this.PopulateObservableArray = (someJsonArrayData: any) => {
this.SomeObservableArray.removeAll();
someJsonArrayData.forEach(function(someJsonData) {
this.SomeObservableArray.push(new SomePojo(someJsonData));
});
};
}
}
出力されたコードは次のようになります。
var ViewModel = (function(){
function ViewModel(){
var _this = this;
this.SomeObservableArray = new ko.observableArray();
this.AddMultipleEntitiesToObservableArray = function(someJsonArrayData) {
_this.SomeObservableArray.removeAll();
someJsonArrayData.forEach(function(someJsonData) {
this.SomeObservableArray.push(new SomePojo(someJsonData));
});
}
};
return ViewModel;
})();
大規模なプロジェクトの出力を単純化しているだけなので、タイプミスがあったことをお詫びしthis
ますthis.SomeObservableArray is undefined
。
考えられる解決策の1つは、foreachを抽出して独自の方法にすることだと確信していますが、これはブルータックにセロテープを貼り付けているように感じるので、変更可能なよりエレガントな解決策や私の側での不正行為があるかどうか疑問に思っていました少なくとも読みにくくする必要はありません。