Javascript / Typescript'这个'范围

时间:2016-10-04 13:07:44

标签: javascript typescript

我正在使用Ionic2和Meteor。但是,我确实有一个与this对象范围相关的Javascript / Typescript问题。

我有read我应该使用bind,因为我没有在适当级别处理this

我可能不理解这个概念,因为我尝试以下操作,但尝试调用函数时出错。

this.subscribe('messages', this.activeChat._id, this.senderId, () => {
    this.autorun(() => {
        let promiseMessages: Promise<Mongo.Collection<Message>> = this.findMessages();
        promiseMessages.then((messageData: Mongo.Collection<Message>) => {
        messageData.find().forEach(function (message: Message) {
            setLocalMessage.bind(message);
        });
    });
});

private setLocalMessage(message: Message): void {
   this.localMessageCollection.insert(message);
}

当我尝试构建应用时出现以下错误:

ERROR in ./app/pages/messages/messages.ts
(72,19): error TS2304: Cannot find name 'setLocalMessage'.

更新

感谢您提供以下建议。

我现在正在使用以下内容,它确实有效。

          let promiseMessages: Promise<Mongo.Collection<Message>> = this.findMessages();
          promiseMessages.then((messageData: Mongo.Collection<Message>) => {
            messageData.find().forEach((message: Message) => {
              this.setLocalMessage(message);
            });
          });

2 个答案:

答案 0 :(得分:2)

  

我已经读过,如果我没有在适当的级别处理此问题,我应该使用bind

现在有点过时,最好看看How to access the correct `this` context inside a callback?这些日子,它们还会向您展示如何使用箭头功能。

您收到错误消息是因为setLocalMessage不是变量,但仍然是this的属性,因此您必须按原样访问它。在您的案例中基本上有三种解决方案:

  • bind

    messageData.find().forEach(this.setLocalMessage.bind(this));
    
  • forEach的上下文参数(假设它是Array方法):

    messageData.find().forEach(this.setLocalMessage, this);
    
  • 另一个箭头功能:

    messageData.find().forEach((message: Message) => {
        this.setLocalMessage(message);
    });
    

答案 1 :(得分:1)

这里有一些问题。

在ES6(以及TypeScript)中,您需要使用显式引用实例成员,例如this.setLocalMessage。无论代码在哪里,只写setLocalMessage无效。

function内,this对象可能不是您所期望的。您需要从函数外部捕获this对象并将其放在变量中,如下所示:

this.subscribe('messages', this.activeChat._id, this.senderId, () => {
    this.autorun(() => {
        let self = this;
        let promiseMessages: Promise<Mongo.Collection<Message>> = this.findMessages();
        promiseMessages.then((messageData: Mongo.Collection<Message>) => {
        messageData.find().forEach(function (message: Message) {
            self.setLocalMessage(message);
        });
    });
});

或者,您可以使用箭头表达式,其中this与围绕它的代码中的this.subscribe('messages', this.activeChat._id, this.senderId, () => { this.autorun(() => { let promiseMessages: Promise<Mongo.Collection<Message>> = this.findMessages(); promiseMessages.then((messageData: Mongo.Collection<Message>) => { messageData.find().forEach(message => this.setLocalMessage(message)); }); }); }); 相同:

<?xml version="1.0" encoding="UTF-8"?>

这不是TypeScript本身的问题。没有它,代码将在运行时失败。