これは、「この」問題へのこの TypeScript および Knockout バインディングに対する追加の質問 です - ラムダ関数が必要ですか? これを Knockout 関数内 に保持する 2 つの方法が提案されています。
class viewmodelclass {
declaredinconstructor: (args) => void;
constructor(public someobjects: Array) {
this.declaredinconstructor=(args) =>{
}
}
declaredoutside(args) {
}
declaredoutsidecorrectly = (args) => {
console.log(this);
};
}
この Javascript の生成:
var viewmodelclass = (function () {
var _this = this;
this.declaredoutsidecorrectly = function (args) {
console.log(_this);
};
function viewmodelclass(someobjects) {
this.someobjects = someobjects;
this.declaredinconstructor = function (args) {
};
}
viewmodelclass.prototype.declaredoutside = function (args) {
};
return viewmodelclass;
})();
これを関数内で使用する場合は、次の HTML コードが必要です。
<div data-bind="foreach: someobjects" >
<a href="#" data-bind="click: $parent.declaredinconstructor">link 1</a>
<a href="#" data-bind="click: $parent.declaredoutside.bind($parent)">link 2</a>
<a href="#" data-bind="click: $parent.declaredoutsidecorrectly">link 3</a>
</div>
どちらも (はず) 動作しますが、どちらがより正確で高速ですか?
HTMLコードの方が少し優れているため、コンストラクターで宣言することを好みます。
編集: Basarat のビデオのおかげで、Typescript に関するビデオを思い出しました - Typescript は、生成された Javascript で _this を宣言することにより、これを保持するのに役立ちます - ただし、必要な場合のみ! (console.log(this) _this を書かなければ、Typescript によって生成されません。)
結論 - 正しく宣言された場合、外側の実装が HTML に漏れることはないため、Amitabh が指摘するように、最も効率的なパターンを選択するのが正しい答えです: 各インスタンスまたはプロトタイプに関数をアタッチします。