使用ngGrid中的afterSelectionChange将此点设置为null

时间:2014-10-22 16:29:57

标签: angularjs typescript this ng-grid

我正在使用angular和打字稿编写应用程序 我使用ng-grid,我必须处理afterSelectionChange事件。 我试图以两种方式设置事件处理程序

this.$scope.settoriGridOptions.afterSelectionChange = this.afterSelectionChange;  

其中this.afterSelectionChange是控制器类的方法,

  this.$scope.settoriGridOptions.afterSelectionChange = (... ) => {};  

包含内部代码,但在这两种情况下 this 指针都不正确,我无法访问控制器的服务。
   我该如何解决这个问题?

经过更多测试和阅读一些文章之后,我发现问题是在函数调用中隐式传递this指针作为参数。

如果我写

$scope.filtroSoluzione = this.filtroSoluzione;

调用时,this指针设置为null,但如果我写

$scope.filtroSoluzione = () => { return this.filtroSoluzione() };

$ scope.filtroSoluzione =()=> {..内联代码...};

我正确设置了这个指针 我怎样才能有更一致的行为?我不想总是把代码写在里面,因为这会使类更难阅读和导航

感谢,
   卢卡

1 个答案:

答案 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() {}声明。