2012-03-19 74 views
1

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

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

我相信这可以被视为一个错误,你应该在emberjs的问题跟踪中打开一张票。 – 2012-03-20 12:21:52

+1

也确保您直接从Github获得最新版本的代码并进行构建......因为他们上传的最新版本超过2个月 – 2012-04-11 19:35:33

回答

1

余烬数据源代码解释得好:

// 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模型似乎很明显;-)