6

我想加载整个集合,然后一次只剥离记录以用作模型,而不是每次都往返于服务器。

我已经想出了如何使用 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 总是正确的。

谢谢!

4

2 回答 2

7

还有另一个我可以绑定的事件吗?

确实有一个事件你可以听,那就是didLoad

我试过 App.people.on('isLoaded'),但 isLoaded 总是正确的。

至于isLoaded对此有很多困惑,请参见此处,例如,混淆来自这样一个事实,即当商店完成加载记录时,isLoaded标志被设计RecordArray为 true ,即使最初是的,因为没有记录已经在当地可用。然后,当对服务器的请求返回时,RecordArray将使用从后端接收到的记录填充,并且绑定将启动并更新您的模板。

指南中所述:

既已加载又干净的记录意味着已从服务器接收到有关其属性和关系的信息,并且未在客户端本地进行任何更改。

是上面说的是什么使didLoad火。

有关更多与模型相关的事件,您可以收听查看模型生命周期下的指南

现在到您的设置,您可以将代码重写为如下所示:

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;
  }
});

希望能帮助到你。

于 2013-06-22T22:53:25.043 回答
2

如果承诺没有在正确的时间解决,我认为这将是 Ember/data 中的一个(相当大的)错误。我建议用 Emberjs/data 填充一个错误。

我怀疑您对不同承诺的使用可能会导致此错误。

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 库上的文档在找出使用 Promise 的最佳方式时非常有用。Ember 使用 RSVP,这是一个不同的库,但原理相似。

于 2013-06-25T08:29:41.867 回答