2016-04-15 3 views
3

Ich versuche, socket.io mit dem Aurelia-Framework zu verwenden. Beim Laden der Seite werden die Daten vom Socket-Server abgerufen, danach jedoch nicht.So verwenden Sie socket.io in Aurelia

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 = ''; 
    } 
} 

Ich liebe Aurelia, aber ich scheitere mit der Integration von socket.io.

Antwort

5

Versuchen Sie, Ihren Listener in activate() anstelle von constructor() zu binden.

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

Dies ist die richtige Antwort. Der Konstruktor() wird nur einmal aufgerufen, wenn die Einstellungen erstellt werden (denke Singleton), dann wird activate() jedes Mal aufgerufen, wenn die Ansicht besucht wird, einschließlich des ersten Mals. –

+0

Korrigieren. Alle Daten, von denen das Viewmodel von der Serverseite abhängig ist, sollten in activate oder gar canActivate behandelt werden. Dies ermöglicht es Ihnen, eine Versprechung zurückzugeben und das Laden des Ansichtsmodells zu verzögern, bis es verrechnet wird. –