2016-04-15 13 views
3

aureliaフレームワークでsocket.ioを使用しようとしています。 ページをロードすると、データはソケットサーバーから取得されますが、その後はリッスンされません。Aureliaでsocket.ioを使用する方法

import io from 'socket.io-client'; 
var socket = io.connect('http://localhost:3000'); 

export class Settings { 
    newstate = ''; 

    constructor() { 
     socket.on('users', // <- only works once (when loading the page) but doesn't listen after 
      function (userlist) { 
       this.users = userlist; 
      }.bind(this)); 
    } 

    addstate() { 
     socket.emit('add state', this.newstate); // <- works flawless 
     this.newstate = ''; 
    } 
} 

私はアウレリアが大好きですが、私はsocket.ioを統合することで失敗し続けます。

答えて

5

コンストラクター()の代わりにactivate()でリスナーをバインドしてみてください。

import io from 'socket.io-client'; 
var socket = io.connect('http://localhost:3000'); 

export class Settings { 
    newstate = ''; 

    activate() { 
     socket.on('users', // <- only works once (when loading the page) but doesn't listen after 
      function (userlist) { 
       this.users = userlist; 
      }.bind(this)); 
    } 

    addstate() { 
     socket.emit('add state', this.newstate); // <- works flawless 
     this.newstate = ''; 
    } 
} 
+0

これは正解です。コンストラクタ()は、Settingsが作成されたときに一度だけ呼び出されます(シングルトンと考える)。次にactivate()は初めてビューを含む、ビューが訪問されるたびに呼び出されます。 –

+0

正しい。ビューモデルがサーバー側から依存するすべてのデータは、activateまたはcanActivateで処理する必要があります。これにより、Promiseを返し、解決するまでviewmodelの読み込みを遅らせることができます。 –

関連する問題