2013-06-12 21 views
6

Czy istnieje sposób na wykonywanie danych w czasie rzeczywistym za pomocą Ember.js?Wymaganie danych modelu w trasie Ember.js

To, czego szukam, to możliwość wprowadzania zaktualizowanych i nowych rekordów (bez usuwania) do wcześniej zwróconych wyników.

Więc powiedzmy, że mam routery że wygląda tak, że umożliwia sortowanie i stronicowania (aka pominąć):

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() {} 
     }); 
    }, 

}); 

Działa to doskonale - sortuje i pomija poprawnie w sensie statycznym.

. (Uwaga: nie używam Ember danych - tylko zestaw Ember obiektów)

Jednak nadejściu wiadomości w sposób ciągły i chciałbym wyświetlanie tych komunikatów automatycznie ponowić kwerendę nową wiadomość, kiedy przybyć.

Mam websocket, który mówi mi, kiedy to się dzieje i działa poprawnie i używam infrastruktury Ember.Instrumentation, aby skierować to zdarzenie do zamknięcia setupController, które mam. Ale kiedy wykonuję się w reakcji na to zdarzenie, aby załadować ponownie, zawartość wszystkie znika. Co ja robię źle?

Odpowiedz

3

W końcu doszedłem do tego, chociaż chciałbym, żeby ekspert od emberów powiedział mi, dlaczego.

Jeśli używam obietnic, a następnie(), aby uzyskać prawdziwy wynik, a następnie ustawić że na kontrolerze, to działa:

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() {} 
    }); 
}, 

Chciałbym zrozumieć, dlaczego - bo myślałem Ember mógł wziąć obietnica oprócz rzeczywistej wartości. To powiedziawszy, to rozwiązanie jest w rzeczywistości ładniejsze, ponieważ nie ma flashowania podczas wywołania REST roundtrips - dane są zamieniane tylko wtedy, gdy jest to zakończone.

+0

Metoda modelu na Ember.Route może zwrócić obietnicę, ale jeśli tak, router czeka na rozstrzygnięcie lub niepowodzenie obietnicy przed wywołaniem setupController(). Sami kontrolerowie zawsze oczekują konkretnego modelu, a nie obietnicy. – nicknystrom

4

myślę, jednym ze sposobów jest wykonanie App.Message.find() okresowo - Ember zajmie aktualizacje swoich poglądów

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

mnie poprawić, jeśli się mylę - Jestem w trakcie nauki Ember

+0

Przepraszam - zbytnio uprościłem sytuację w moim pierwszym poście. Mam bardziej złożone zapytanie, które po prostu jest proste, więc nie sądzę, że to zadziała. Edytowałem i rozszerzałem moje pytanie. – outside2344