我正在使用angular和打字稿编写应用程序 我使用ng-grid,我必须处理afterSelectionChange事件。 我试图以两种方式设置事件处理程序
this.$scope.settoriGridOptions.afterSelectionChange = this.afterSelectionChange;
其中this.afterSelectionChange是控制器类的方法,
和
this.$scope.settoriGridOptions.afterSelectionChange = (... ) => {};
包含内部代码,但在这两种情况下 this 指针都不正确,我无法访问控制器的服务。
我该如何解决这个问题?
如果我写
$scope.filtroSoluzione = this.filtroSoluzione;
调用时,this指针设置为null,但如果我写
$scope.filtroSoluzione = () => { return this.filtroSoluzione() };
或
$ scope.filtroSoluzione =()=> {..内联代码...};
我正确设置了这个指针 我怎样才能有更一致的行为?我不想总是把代码写在里面,因为这会使类更难阅读和导航
感谢,
卢卡
答案 0 :(得分:1)
感谢您编辑中的额外信息,我现在看到了问题。
class foo {
public afterSelectionChange = () => {
console.log(this);
}
}
当你像我上面那样声明你的函数时,你的this
是实例,而不是你所知道的,因为它捕获了this
变量。它带来了成本,因为它现在为您的类的每个实例创建一个新的afterSelectionChange函数。在这种情况下,我认为它仍然是你想要的。
var foo = (function () {
function foo() {
var _this = this;
this.afterSelectionChange = function () {
console.log(_this);
};
}
foo.prototype.baz = function () {
console.log(this);
};
return foo;
})();
在上面的代码中,你可以看到用name = () => {}
和正常方式声明函数时的区别。
另一种解决方案可能是:
this.$scope.settoriGridOptions.afterSelectionChange = this.afterSelectionChange.bind(this);
但是我发现它真的很不错......(这应该适用于你习惯的普通public afterSelectionChange() {}
声明。