2016-10-04 20 views
0

私はIonic2とMeteorを使っています。私はしかし、thisオブジェクトの範囲に関連するJavascript/Typescriptの問題があります。Javascript/Typescript 'this' scope

適切なレベルでthisにハンドルがない場合はbindを使用する必要があります。readです。

私はおそらく、次のことを試しますが、関数を呼び出すときにエラーが発生するので、概念を理解できません。

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'. 

UPDATE

以下のアドバイスをありがとうございます。

私は今、以下を使用しており、動作します。

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

これはタイプミスかもしれませんが、あなたの関数はsetLocal ** Message **と宣言されています。エラーはsetLocal ** Nessage **です。これはタイプミスか実際の問題ですか? –

+0

これは、 "typescript"タグを追加する価値があるかもしれません(これは、 "javascript"タグの代わりに)、これはタイスクリプトコードです。 – UnholySheep

+0

申し訳ありませんが、今すぐ修正されました。 – Richard

答えて

2

私は適切なレベルで、この上のハンドルを持っていないとき、私はbindを使用する必要があることを読みました。

最近では、How to access the correct `this` context inside a callback?をよく見ていて、矢印機能の使い方を示しています。

setLocalMessageは変数ではなく、依然としてthisのプロパティなので、エラーメッセージが表示されるので、そのようにアクセスする必要があります。

  • bind

    messageData.find().forEach(this.setLocalMessage.bind(this)); 
    
  • forEachのcontext引数(それはArray方法だと仮定した場合):

    messageData.find().forEach(this.setLocalMessage, this); 
    
  • 別の矢印の機能あなたの場合は3つの解決策は基本的にあります。

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

ありがとうございました。私は試してみます – Richard

+0

Bergiさん、ありがとうございました。しかし、私は今、その機能の何かがうまくいかないという問題を抱えています。あなたは次のことを見て気になりますか? http://stackoverflow.com/questions/39854896/typscript-not-inserting-into-mongo-collection – Richard

1

ここではいくつかの問題があります。

ES6(したがってタイプスクリプト)では、this.setLocalMessageなどの明示的なthisを使用してインスタンスメンバーを参照する必要があります。 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)); 
     }); 
    }); 
}); 

これはTypeScript自体の問題ではありません。それがなければ、コードは実行時に失敗するだけです。

+0

ありがとう、私はそれを試してみましょう – Richard

+0

ありがとうグレッグ、それは働いて、今はその関数を呼び出します。しかし、私は今、その機能の何かがうまくいかないという問題を抱えています。あなたは次のことを見て気になりますか? http://stackoverflow.com/questions/39854896/typscript-not-inserting-into-mongo-collection – Richard