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

Eri*_*kis 6 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;
  }
});
Run Code Online (Sandbox Code Playgroud)

如果我将then()的主体包装在一个setTimeout中,并让它等待几秒钟,那么一切都很好.

我可以以某种方式绑定到另一个事件吗?我尝试了App.people.on('isLoaded'),但isLoaded始终是真的.

谢谢!

int*_*xel 7

我可以以某种方式绑定到另一个事件吗?

确实有一个你可以听的事件就是这样didLoad.

我尝试了App.people.on('isLoaded'),但isLoaded始终是真的.

至于isLoaded对此存在很多混淆,例如,请参阅此处,混淆来自于当商店完成加载记录时,设计isLoaded标志设置为true 的事实,即使最初为空,因为没有记录是已在本地提供.然后,当对服务器的请求返回时,将填充从后端接收的记录,绑定将启动,模板将更新.RecordArrayRecordArray

指南中所述:

加载和清除的记录表示已从服务器接收有关其属性和关系的信息,并且未在客户端本地进行任何更改.

上面说的是什么使得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;
  }
});
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.