2017-04-26 13 views
0

角度2(typescriptです)10ソケットと簡単なチャットアプリケーションを構築IMとnodejsをプロパティを読み取ることができません。ユーザーはので、私はこの単純な関数内のすべてのコードをラップに接続しようとするたびは未定義typescriptですの「放出」

connectUser(name){ 
 
    
 
    \t 
 
    \t if (name == null || name == ""){ 
 
    \t return \t console.log('you must enter a valid username'); 
 
    \t 
 
    \t } 
 
    \t this.username = name; 
 

 
    \t this.socket.emit('add-user',name); 
 
    \t //load connected users in the user-window section 
 
    \t this.socket.emit('request-users',{data:'request users success'}); 
 
    \t var connecctedUsersListener$ = Observable.fromEvent(this.socket,'users'); 
 
    \t connecctedUsersListener$.subscribe((observer:any)=>{ 
 
    \t \t this.users = observer; 
 
    \t },(err)=>{ 
 
    \t \t if(err) throw err; 
 
    \t },()=>{ 
 
    \t \t console.log('complet'); 
 
    \t }); 
 
    
 
    //load messages and keep track of Them 
 
    this.socket.emit('request-messages',{data:'request Messages success'}); 
 
    var messageListener$ = Observable.fromEvent(this.socket,'message'); 
 
    messageListener$.subscribe((observer:any) =>{ 
 
    \t this.messages = observer; 
 
    \t 
 
    }) 
 

 
    }

は、しかし、私はbootbox.promptを使用しよう

addUser(){ 
 
    bootbox.prompt('what is your name ',function(name){ 
 
    connectUser(name); // this is the function in the first code snippet \t 
 

 
    \t }); 
 
    }

私はこの奇妙なエラープロパティを読み取ることができません取得、私はそれを修正し、問題はここに何ができる方法 未定義の「放出」?

答えて

3

addUserからconnectUserを呼び出すときは、別の関数(明らかにコールバック)から実行しています。

Javascriptが使用していることラッパー関数に「この」を結合し、その機能は「ソケット」メンバを持っていません。

あなたが直接接続ボタンからCONNECTUSER関数を呼び出すと、あなたはおそらく、「この」「ソケット」メンバが含まれていないオブジェクトにバインドされ、このように、オブジェクトからインラインでそれを呼び出しています。

ラッパーがあなたに影響を及ぼしている「{})の関数(」どのように見ているために次のコードを確認してくださいするために

function(name) { connectUser(name); } 

class Whatever { 
    socket: { emit: string } 

    constructor() 
    { 
     this.socket = { emit: 'works' }; 
    } 

    doSomething() 
    { 
     console.warn(this.socket.emit); 
    } 

    works() 
    { 
     this.doSomething(); 
     (() => this.doSomething())(); 
    } 

    doesntWork() 
    { 
     (function() { this.doSomething() })(); 
    } 
} 

let obj = new Whatever(); 
obj.works(); 
obj.doesntWork(); 

基本的にあなたはおそらくこれを変更することができますこの

(name) => connectUser(name) 

とする必要があります。

関連する問題