2012-05-16 5 views
4

У меня есть приложение, которое использует данные ember-data для хранения данных и StateManager для управления своим глобальным состоянием. Поскольку загрузка данных является асинхронной, мне интересно, как поймать событие, в котором говорится, что все данные загружены. Точно, я состояние под названием «загрузки», где я загрузить данные с:Данные Ember и Ember StateManager

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

Когда модель загружается, я немного постобработки. Это делается в подзадаче «загрузки» с именем «постобработка». Я транзит в «постобработка», когда каждый Modele получил «didLoad» событие:

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

Когда каждые данные загружаются и после обработки приложение должно проходить в другое состояние «редактирования», который находится на том же уровне, что и " погрузка ":

 loading -> postprocessing 
root/
    \ 
     editing 

Какое событие следует уловить, чтобы произошел переход? Имеет ли в хранилище данных ember-data Store обратный вызов?

ответ

0

Попробуйте наблюдать «[email protected]» и вызывать stateManager.sent («edit») в массиве Controller для моделей. Что-то вроде:

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

Возможно, это будет более простой способ. Или, возможно, более правильный ...

5

При использовании данных ember метод find возвращает прокси-сервер массива. Вы можете наблюдать поле isLoaded на этом объекте.

var data = App.store.find(App.Model, {}); 
data.addObserver('isLoaded', function() { 
    if (data.get('isLoaded')) { 
     .... 
    } 
}); 

Но не забудьте очистить свой наблюдатель через removeObserver.

Я добавил эту утилиту к встроенному массиву записей ember-data.

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

Итак, теперь вы можете просто сделать

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

Вы также можете сделать что-то вроде

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

onData: function() { 
    if (this.get('data.isLoaded')) { 
     ... 
    } 
}.observes('data.isLoaded') 
Смежные вопросы