0

我想知道第一次渲染所有内容的时间,但这Ember.run.scheduleOnce('afterRender'还不够,因为模板中有承诺。

{{#each entity in model.entities}}
  {{entity.anotherEntity.name}}
{{/each}}
{{!-- more like above --}}

异步关系和承诺在哪里entities以及在哪里。呈现该内部内容之前的点击anotherEntitiesafterRender我目前的解决方案是:

Ember.run.scheduleOnce('afterRender', this, function() {
  Ember.RSVP.all([
    this.model.get('entities').then(function(entities) {
      return Ember.RSVP.all(entities.map(function(entity) {
        return entity.get('anotherEntity');
      }));
    }),
    // more like above
  ]).then(function() {
    console.log('done-rendering');
  });
});

有更好的方法吗?这甚至可能还不够,因为在最后一个 Promise 解析和模板呈现的最后一部分之间可能存在一瞬间。afterRender在所有承诺都确定之后,也许我需要另一次或类似的检查。

4

1 回答 1

0

如果您要使用afterRender队列,您希望在工作完成之后、工作渲染之前安排调用。这意味着在您的承诺解决之前调用它可能会涉及时间问题(正如您所指出的)。如果我是你,我会在你的承诺解决后安排通话。

this.model.get('entities').then(function(entities) {
    return Ember.RSVP.all(entities.map(function(entity) {
        return entity.get('anotherEntity');
    });
}).then(function() {
    Ember.run.scheduleOnce('afterRender', this, function() {
        // Your work is finished
        // You can now schedule more work for after rendering
    });
});

不幸的是,我不知道比这更优雅的方式。一般来说,afterRender队列不经常使用(我只在将第三方库包装在组件中时使用它)所以没有理由让它更容易使用。

于 2015-03-12T14:12:23.587 回答