1

我正在编写一个基于 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)

这是怎么回事?

4

1 回答 1

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”。

“查找”方法向适配器询问数据 - 这会在当前可用的数据哈希池中查找它,并在您的情况下找到它,因为您已经提供了它。然而,在其他情况下,数据可能不存在于浏览器本地,但仍保留在服务器上,这将触发适配器中的 ajax 请求以获取它。

所以“didLoad”目前只能与适配器结合使用(例如:find)

但我完全同意你的看法,因为在加载 vai Store.load 的模型上触发“didLoad”似乎很明显;-)

于 2012-06-02T23:49:51.083 回答