在事件监听器中访问`this`

时间:2017-12-11 21:09:18

标签: javascript scope twilio twilio-programmable-chat

写在打字稿中,我有这个:

export class EventDiscussionPage {
    messages: any = []
    private _channel: any;
    initChat() {
      this._channel.on('messageAdded', function(message) {
        this.messages.push(message);
      }
    }
}

添加邮件后,我会收到cannot read property 'push' of undefined。我想我有一个范围问题 - 如何将邮件添加到this.messages

2 个答案:

答案 0 :(得分:3)

您可以使用ES6 lambda,而不是使用函数闭包导致重新赋值的函数close over。

你得到类似的东西 this._channel.on('messageAdded', (message) => this.messages.push(message));

有关Javascript中this范围的更多信息,请访问How to access the correct `this` inside a callback?

答案 1 :(得分:3)

您有一个范围问题。使用上下文:

export class EventDiscussionPage {
    messages: any = []
    private _channel: any;
    initChat() {
      var ctx = this;
      this._channel.on('messageAdded', function(message) {
        ctx.messages.push(message);
      }
    }
}

你所指的this是" _channel",你基本上需要携带来自父母的引用来正确地调用它。

您还可以使用箭头函数语法来避免这种情况(因为它会延续父项的上下文):

export class EventDiscussionPage {
    messages: any = []
    private _channel: any;
    initChat() {
      this._channel.on('messageAdded',(message) => {
        this.messages.push(message);
      }
    }
}