在ember-data中异步加载数据

时间:2012-03-19 15:58:05

标签: asynchronous ember.js ember-data

我正在编写一个基于ember-data的应用程序,它以异步方式加载所有数据。但是,在使用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 个答案:

答案 0 :(得分:1)

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'目前只能与适配器结合使用(例如:find)

但是我完全同意你的意见,因为在加载vai Store.load的模型上触发'didLoad'似乎非常明显,所以应该更改; - )