打字稿淘汰最好的方法来保留'这个'?

时间:2013-07-26 08:58:43

标签: knockout.js this typescript

这是一个额外的问题 TypeScript and Knockout binding to 'this' issue - lambda function needed? 其中提出了两种在Knockout函数中保留 this 的方法:

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;
})();

如果您想在函数中使用 this ,则需要以下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)_这将不会由Typescript生成。)

结论 - 当正确声明时,外部实现不会泄漏到HTML,因此正如Amitabh指出的那样,正确的答案是选择最有效的模式:将函数附加到每个实例或原型。 / p>

2 个答案:

答案 0 :(得分:2)

肯定更喜欢模式1.原因是在模式2中,类的底层实现正在泄漏到我的书中不好的html中。

答案 1 :(得分:1)

虽然我同意BASarat的观点,即模式2正在泄漏html的实现。但是在模式1中,如果我们有一个viewModel列表,那么我们将该函数附加到该对象的每个实例,而不是将其附加到模型的原型。如果我们有一个包含大量项目的列表,这可能是一个问题。

因此可能存在我们可能必须使用模式2的情况。