这是 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 指出的那样,选择最有效的模式:将函数附加到每个实例或原型。