2017-10-10 3 views
0

Ich versuche, Daten mit Ember CLI von einer Legacy-API zu laden, die für die Verwendung von Ember-Daten ungeeignet scheint. Diese Daten werden normalerweise geladen, wenn die Seite geladen und dann an vielen Stellen in der App wiederverwendet wird. Ich habe einen Dienst ‚legacy_data‘ für diese erstellt:Können Sie Dienste mit emberjs zurückstellen?

import Ember from 'ember'; 

export default Ember.Service.extend({ 
    ready: null, 
    legacy_data: null, 

    init(){ 
    this.ready = Ember.$.ajax(...).done(function(legacy_data){ 
    this.set('legacy_data', legacy_data); 
    } 

    computed_attr: Ember.computed('legacy_data', function(){ ... }, 

    ...more functions and computed attributes 
}); 

Weil ‚init‘ Funktion nicht zu unterstützen scheint ein Versprechen der Rückkehr (wie das Modell Haken auf einer Strecke der Fall ist), wann immer ich will diesen Service nutzen, ich habe so etwas wie dies zu tun:

injected_service.ready.then(function(legacy_data){ 
... use service 
}); 

was in der Praxis bedeutet, dass ich mit einem ganzen Bündel von zusätzlichen Versprechen Handhabung in meiner Code-Basis am Ende - es fühlt sich an wie ich gegen den Strom auf diesem einem am Schwimmen.

Gibt es einen besseren Weg, dies zu tun? Vielleicht ein Lifecycle-Hook oder ein Factory/Initializer, der die Deferred-Service-Initialisierung unterstützt, damit ich mich dann nicht überall in meiner Codebase darum kümmern muss? Unterstützen Initialisierer das? Ich habe es in keinen Beispielen davon gesehen. Gibt es eine alternative Möglichkeit, dieses Problem zu umgehen? (Ember-Daten müssen das gleiche Problem irgendwie behandeln, aber ich bin neu im Rahmen so unsicher bin)

Vielen Dank für Ihre Hilfe.

Antwort

1

In Ember, Route haben Haken wie beforeModel, model, afterModel. Wenn Sie Versprechen von diesen Haken zurückgeben, werden die Versprechen von Ember erledigt.

Übrigens, selbst wenn Sie Ember Data verwenden, sollte der Aufruf store über Routen erfolgen. Wenn Sie auf den Speicher in Ihren Komponenten zugreifen, müssen Sie erneut mit Versprechungen umgehen.

Aber Sie bitten um eine Möglichkeit, die Anwendung zu verschieben, bis das Versprechen gelöst wurde. Dies kann durch application route s beforeModel Haken erreicht werden. (Ich brauchte dies, um die Benutzerberechtigungen in meiner Client-App abzurufen. Da ich die Erlaubnisverspre- chen-Behandlung nicht auf allen meinen Routen platzieren kann, lege ich sie in meine application route.) Schauen Sie sich also this twiddle an.

1

Ich denke, Sie sollten nur den Code aus dem init Haken auf eine Funktion loadData bewegen (oder was auch immer Namen Ihrer Wahl), und rufen Sie dann diese Funktion aus dem beforeModel der Anwendung Route. Dies stellt sicher, dass die Daten immer geladen sind.