2013-06-12 44 views
6

Gibt es eine Möglichkeit, Echtzeitdaten mit Ember.js zu erstellen?Anfordern von Modelldaten in der Route Ember.js

Was ich suche ist die Fähigkeit, aktualisierte und neue Datensätze (nicht löschen) in zuvor zurückgegebene Ergebnisse zu injizieren.

Also lassen Sie uns sagen, dass ich Router haben, der so aussieht, dass und Paging ermöglicht das Sortieren (aka überspringen):

App.Router.map(function() { 
    this.resource('messages', { path: '/messages/skip/:skip/sort/:sort/direction/:direction' }); 
}); 

App.MessagesRoute = Ember.Route.extend({ 

    model: function(params) { 
     this.set('params', params); 
     return this.query(); 
    }, 

    query: function() { 
     var sort = {}; 
     sort[this.get('params').sort] = parseInt(this.get('params').direction); 

     return App.Message.find({}, { 
      skip: this.get('params').skip, 
      sort: sort 
     }); 
    }, 

    setupController: function(controller, model) { 
     var self = this; 
     this._super(controller, model); 

     Ember.Instrumentation.subscribe('onMessage', { 
      before: function(name, timestamp, message) { 
       self.controller.set('content', self.query()); 
      }, 
      after: function() {} 
     }); 
    }, 

}); 

Dies funktioniert gut - es sortiert und überspringt richtig in einem statischen Sinn.

. (Anmerkung: Ich bin Ember Daten nicht verwenden - nur eine Reihe von Ember Objects)

jedoch Nachrichten eintreffen kontinuierlich und ich würde die Anzeige dieser Meldungen wie requery automatisch die neue Nachricht, wenn sie ankommen.

Ich habe eine WebSocket, die mir sagt, wenn das passiert und das funktioniert ordnungsgemäß und ich benutze die Ember.Instrumentation-Infrastruktur, um dieses Ereignis an die SetupController Schließung ich habe. Aber wenn ich als Reaktion auf dieses Ereignis eine Neuladung durchführe, verschwindet der Inhalt vollständig. Was mache ich falsch?

Antwort

3

Ich habe es endlich herausgefunden, obwohl ich einen Ember-Experten gerne hätte, der mir sagt warum.

Wenn ich Versprechen verwenden und dann(), um das wirkliche Ergebnis zu bekommen und dann das Set auf dem Controller, es funktioniert:

setupController: function(controller, model) { 
    var self = this; 
    this._super(controller, model); 
    Ember.Instrumentation.subscribe('onMessage', { 
     before: function(name, timestamp, message) { 
      var p = self.query(); 

      p.then(function(response) { 
       self.controller.set('content', response); 
      }); 
     }, 
     after: function() {} 
    }); 
}, 

Ich würde gerne verstehen, warum - weil ich dachte, Ember eine nehmen könnte Versprechen neben einem tatsächlichen Wert. Allerdings ist diese Lösung eigentlich schöner, da während der REST-Call-Roundtrips kein Blinken auftritt - die Daten werden nur ausgetauscht, wenn dies abgeschlossen ist.

+0

Die Modellmethode auf Ember.Route kann eine Verheißung zurückgeben, aber wenn dies der Fall ist, wartet der Router auf das Versprechen, vor dem Aufruf von setupController() aufzulösen oder fehlzuschlagen. Controller selbst erwarten immer ein konkretes Modell, kein Versprechen. – nicknystrom

4

ich denke, eine Möglichkeit App.Message.find() ist in regelmäßigen Abständen auszuführen - Ember wird die Updates Ihrer Ansichten behandeln

window.setInterval(function(){App.Message.find()},1000); 

korrigiert mich wenn ich falsch bin - ich bin immer noch lernen ember

+0

Entschuldigung - ich habe die Situation in meinem ersten Beitrag zu stark vereinfacht. Ich habe eine komplexere Abfrage, dass nur eine einfache Suche alle, so dass ich glaube nicht, dass dies funktionieren wird. Ich habe meine Frage bearbeitet und erweitert. – outside2344

Verwandte Themen