Загрузка данных асинхронно в ember-data - PullRequest
1 голос
/ 19 марта 2012

Я пишу приложение на основе ember-данных, оно загружает все свои данные асинхронно. Однако функция didLoad не вызывается до тех пор, пока не будет использована find. Например:

App = Ember.Application.create();
App.Store = DS.Store.create({revision: 3});
App.Thing = DS.Model.extend({
  didLoad: function(){
    alert("I loaded " + this.get('id'));
  }
});
App.Store.load(App.Thing,{id: "foo"});

... не вызовет предупреждение, а findAll не вернет модель. Тем не менее, когда я бегу:

App.Store.find(App.Thing,"foo");

Функция didLoad сработает, и ее можно найти с помощью App.Store.findAll(App.Thing).

Что происходит?

1 Ответ

1 голос
/ 03 июня 2012

Исходный код ember-data хорошо это объясняет:

// A record enters this state when the store askes
// the adapter for its data. It remains in this state
// until the adapter provides the requested data.
//
// Usually, this process is asynchronous, using an
// XHR to retrieve the data.

loading: DS.State.create({
  // TRANSITIONS
  exit: function(manager) {
    var record = get(manager, 'record');
    record.fire('didLoad');
  },

  // EVENTS
  didChangeData: function(manager, data) {
    didChangeData(manager);
    manager.send('loadedData');
  },

  loadedData: function(manager) {
    manager.goToState('loaded');
  }
}),

это означает, что didLoad будет запускаться только тогда, когда запись была загружена через адаптер.

Метод 'find' запрашивает у адаптера данные - он ищет их в пуле доступных на данный момент хэшей данных и в вашем случае находит их, потому что вы уже предоставили их. Однако в других случаях данные, возможно, не существуют локально в браузере, но остаются на сервере, что вызывает запрос ajax в адаптере для их получения.

Таким образом, didLoad в настоящее время работает только в сочетании с адаптером (например, найти)

Но я полностью согласен с вами, что это следует изменить, поскольку запуск 'didLoad' на моделях, которые загружаются vai Store.load, кажется довольно очевидным; -)

...