我想加载整个集合,然后只剥离记录以一次用作模型,而不是每次都与服务器进行往返。
我已经弄清楚如何使用 Ember.Deferred 返回承诺,但我无法在正确的时间得到解决的承诺。以下代码每次都只输出“Found 0”:
App.PersonRoute = Ember.Route.extend({
model: function(params) {
var name = "Erik";
var promise = Ember.Deferred.create();
App.people = App.Person.find();
App.people.then(function() {
console.log('Found ' + App.people.get('length'));
var person = App.people.findProperty('name', name)
promise.resolve(person);
});
return promise;
}
});
如果我将 then() 的主体包装在 setTimeout 中,并让它等待几秒钟,一切都会很好。
还有另一个我可以绑定的事件吗?我尝试了 App.people.on('isLoaded'),但 isLoaded 始终为 true。
Thanks!
还有另一个我可以绑定的事件吗?
确实有一个事件你可以听,那就是didLoad
.
我尝试了 App.people.on('isLoaded'),但 isLoaded 始终为 true。
As for isLoaded
对此有很多困惑,请参阅here https://github.com/emberjs/ember.js/issues/2632例如,混乱来自于这样一个事实:isLoaded
标志设置为 true按设计当商店完成加载时RecordArray
记录在案,即使最初empty因为本地还没有可用的记录。然后当对服务器的请求返回时RecordArray
将填充从后端收到的记录,绑定将启动并更新您的模板。
如中所述guides http://emberjs.com/guides/models/model-lifecycle/:
已加载且干净的记录意味着已从服务器接收到有关其属性和关系的信息,并且在客户端本地未进行任何更改。
上面所说的是什么使得didLoad
fire.
对于更多与模型相关的活动,您可以收听并查看下面的指南模型生命周期 http://emberjs.com/guides/models/model-lifecycle/
现在进行设置,您可以将代码重写为如下所示:
App.PersonRoute = Ember.Route.extend({
model: function(params) {
var name = "Erik";
var promise = Ember.Deferred.create();
App.people = App.Person.find();
App.people.on('didLoad', function() {
console.log('Found ' + App.people.get('length'));
var person = App.people.findProperty('name', name)
promise.resolve(person);
});
return promise;
}
});
希望能帮助到你。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)