Model.find()。then()在实际加载记录之前触发

时间:2013-06-22 21:10:19

标签: ember.js ember-data

我想加载整个集合,然后只删除记录,一次一个地用作模型,而不是每次都要到服务器进行往返。

我已经想出如何使用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始终是真的。

谢谢!

2 个答案:

答案 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,这是一个不同的库,但原则是相似的。