更改回调函数中的类变量

时间:2016-11-02 23:34:37

标签: javascript typescript callback

我是打字稿的新手,但我认为这不仅仅是一个javascript问题 - 具体来说,我对如何完成某些事情缺乏了解。

我需要在回调中设置一个类级变量,我不知道如何去做。在我的打字稿类中,我有一个带有胖箭头功能的方法。它调用一个使用回调函数发出ajax请求的对象。

在该回调中,我想在类上设置一个值。简而言之,这就是我所拥有的:

 class MyClass extends SomeOtherClass {
 protected entity = new Entity();

 protected getToolbar() {
    toolbarbuttons.push({
        title: 'hello',
        onClick: () => { 
            outsideService.makeAjaxCall(
                {
                    url: 'somewhere_in_cyberspace'
                },
                function (response) {
                    this.entity.name = response.Name;
                }
            );
         }     
    });
  }
}

该代码不能正常工作,因为在回调当然'this'指的是Window而不是我的类。

很公平,我试图在我的onClick处理程序之前按照_that = this的方式做一些事情,在处理程序退出之后我无法将响应值变为'stick',在某种意义上说后续方法this.entity.name不是回调设置的方法吗?我可以在这做什么或者我错过了什么?

1 个答案:

答案 0 :(得分:1)

第二个功能也需要是箭头功能:

SELECT 
    COUNT(*) AS gas_pulse_count,
    FROM_UNIXTIME(pulse_time - MOD(pulse_time, 5 * 60)) from_time,
    FROM_UNIXTIME((pulse_time - MOD(pulse_time, 5 * 60)) + 5 * 60) to_time
FROM
    gas_pulse
GROUP BY from_time

这编译成:

class MyClass extends SomeOtherClass {
    protected entity = new Entity();

    protected getToolbar() {
        toolbarbuttons.push({
            title: 'hello',
            onClick: () => {
                outsideService.makeAjaxCall({
                    url: 'somewhere_in_cyberspace'
                }, (response) => {
                    this.entity.name = response.Name;
                });
            }
        });
    }
}

正如您所见,typescript将箭头函数转换为常规匿名函数,但它保存了一个引用var MyClass = (function (_super) { __extends(MyClass, _super); function MyClass() { _super.apply(this, arguments); this.entity = new Entity(); } MyClass.prototype.getToolbar = function () { var _this = this; toolbarbuttons.push({ title: 'hello', onClick: function () { outsideService.makeAjaxCall({ url: 'somewhere_in_cyberspace' }, function (response) { _this.entity.name = response.Name; }); } }); }; return MyClass; }(SomeOtherClass)); ,然后在最内部函数中使用。