Asynchronous 在余烬数据中异步加载数据

Asynchronous 在余烬数据中异步加载数据,asynchronous,ember.js,ember-data,Asynchronous,Ember.js,Ember Data,我正在编写一个基于ember数据的应用程序,它异步加载所有数据。但是,在使用find之前,不会调用didLoad函数。例如: 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.Sto

我正在编写一个基于ember数据的应用程序,它异步加载所有数据。但是,在使用
find
之前,不会调用
didLoad
函数。例如:

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)
找到它


发生了什么事?

余烬数据源代码很好地解释了这一点:

// 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”似乎非常明显;-)

余烬数据源代码很好地解释了这一点:

// 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”似乎非常明显;-)

我认为这可能被视为一个bug,您应该在emberjs的问题跟踪中打开一个记录单。另外,请确保您直接从Github获得最新版本的代码并进行构建。。。由于他们上传的最新版本已经超过2个月了,我认为这可能被视为一个bug,你应该在emberjs的问题跟踪中打开一个记录单。同时确保你直接从Github获得最新版本的代码并进行构建。。。因为他们上传的最新版本已经超过2个月了