我正在编写一个基于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)
找到。
发生了什么事?
答案 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'似乎非常明显,所以应该更改; - )