我想加载整个集合,然后只删除记录,一次一个地用作模型,而不是每次都要到服务器进行往返。
我已经想出如何使用Ember.Deferred返回一个承诺,但我无法在合适的时间得到解决的承诺。以下代码只输出“找到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始终是真的。
谢谢!
答案 0 :(得分:7)
我能以某种方式绑定到另一个事件吗?
确实有一个你可以听的事件,那就是didLoad
。
我尝试了App.people.on('isLoaded'),但isLoaded始终是真的。
关于isLoaded
,对此有很多疑惑,例如here,混淆来自isLoaded
标志设置为true 的事实设计当商店为记录加载RecordArray
时,即使最初为空,因为当地没有可用的记录。然后,当对服务器的请求返回时,RecordArray
将填充从后端接收的记录,绑定将启动,模板将更新。
如guides中所述:
加载和清除的记录表示已从服务器收到有关其属性和关系的信息,并且未在客户端本地进行任何更改。
上面说的是导致didLoad
开火的原因。
有关更多与模特相关的活动,您可以聆听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;
}
});
希望它有所帮助。
答案 1 :(得分:2)
如果承诺没有在合适的时间解决,我认为这将是Ember /数据中的(相当重要的)错误。我建议填写Emberjs /数据的错误。
我怀疑你使用不同的诺言可能会导致这个错误。
App.Person.find
已经回复了承诺。从model()
返回时,您应该使用该承诺。同样要解决这个承诺,你只需返回一个结果。
当您集成一些不支持Promises
的外部异步api时,通常需要使用Promises
的实现样式。
我会像你这样重构你的model()
。这可能会解决您的异步计时问题。
App.PersonRoute = Ember.Route.extend({
model: function(params) {
var name = "Erik";
var promise = App.Person.find();
promise.then(function() {
console.log('Found ' + App.people.get('length'));
return App.people.findProperty('name', name)
});
return promise;
}
});
我发现Q library上的文档在找出使用promises的最佳方式时非常有用。 Ember使用RSVP,这是一个不同的库,但原则是相似的。