2012-05-16 1 views
4

J'ai une application qui utilise des données ember pour persiter des données et StateManager pour piloter son état global. Depuis, le chargement des données est asynchrone, je me demande comment attraper l'événement qui dit que toutes les données sont chargées. Précisément, j'ai un état appelé « chargement » où je charge les données avec:Données Ember et Ember StateManager

App.store.find(App.Model, ....) 

Lorsqu'un modèle est chargé, je fais un peu de post-traitement. Ceci est fait dans un sous-état de "chargement" nommé "post-traitement". Je transit « post-traitement » quand chaque modele a un « didLoad » événement:

App.Model = DS.Model.extend { 
    didLoad: -> 
    stateManager.send('postProcess',this) 
} 

Lorsque toutes les données sont chargées et traitées après, l'application devrait transit vers un autre Etat « édition » qui est au même niveau que " chargement ":

 loading -> postprocessing 
root/
    \ 
     editing 

Quel événement devrais-je attraper pour que la transition se produise? Est-ce que le magasin de données-ember a un rappel pour cela?

Répondre

0

Essayez d'observer "[email protected]" et appelez stateManager.sent ("editing"), dans arrayController pour les modèles. Quelque chose comme:

App.ModelArrayController.reopen({ 
    didLoadAllContent: function() { 
     if (content.everyProperty('isLoaded')) { 
      stateManager.transitionTo('editing'); 
     } 
    }.observes("[email protected]") 
)} 

Peut-être un moyen plus facile, bien sûr. Ou peut-être un plus correct ...

5

Lors de l'utilisation de ember-data, la méthode find retourne un proxy de tableau. Vous pouvez observer le champ isLoaded sur cet objet. Mais n'oubliez pas de nettoyer votre observateur via removeObserver.

J'ai ajouté cet utilitaire à la matrice d'enregistrements de données de braises intégrée.

DS.RecordArray.reopen({ 
    onLoad: function(callback) { 
     if (this.get('isLoaded')) { 
      callback(this); 
     } else { 
      var that = this; 
      var isLoadedFn = function() { 
       if (that.get('isLoaded')) { 
        that.removeObserver('isLoaded', isLoadedFn); 
        callback(that); 
       } 
      } 

      this.addObserver('isLoaded', isLoadedFn); 
     } 

     return this; 
    } 
} 

Alors maintenant, vous pouvez juste faire

App.store.find(App.Model, {}).onLoad(function(data) { 
    .... 
}); 

Vous pouvez aussi faire quelque chose comme

init: function() { 
    this.set('data', App.store.find(App.model, {})); 
}, 

onData: function() { 
    if (this.get('data.isLoaded')) { 
     ... 
    } 
}.observes('data.isLoaded')