1

これは、「この」問題へのこの 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 が指摘するように、最も効率的なパターンを選択するのが正しい答えです: 各インスタンスまたはプロトタイプに関数をアタッチします。

4

2 に答える 2