1

这是 TypeScript 和 Knockout 绑定到“this”问题的一个额外问题 - 需要 lambda 函数吗? 其中提出了两种将其保留Knockout 函数中的方法:

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

2

绝对更喜欢模式 1。原因是在模式 2 中,类的底层实现泄漏到 html 中,这在我的书中很糟糕。

于 2013-07-26T09:32:23.583 回答
1

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

所以在某些情况下,我们可能不得不使用模式 2。

于 2013-07-26T14:48:00.373 回答