这是一个额外的问题 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>
答案 0 :(得分:2)
肯定更喜欢模式1.原因是在模式2中,类的底层实现正在泄漏到我的书中不好的html中。
答案 1 :(得分:1)
虽然我同意BASarat的观点,即模式2正在泄漏html的实现。但是在模式1中,如果我们有一个viewModel列表,那么我们将该函数附加到该对象的每个实例,而不是将其附加到模型的原型。如果我们有一个包含大量项目的列表,这可能是一个问题。
因此可能存在我们可能必须使用模式2的情况。