Ember afterRender没有等待承诺

时间:2015-03-12 13:30:04

标签: javascript ember.js handlebars.js promise htmlbars

我想知道所有内容何时第一次呈现,但Ember.run.scheduleOnce('afterRender'是不够的,因为模板中有承诺。

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

entitiesanotherEntities是异同关系和承诺。在内部内容呈现之前afterRender点击。我目前的解决方案是:

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或类似的检查。

1 个答案:

答案 0 :(得分: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队列并不经常使用(我只在组件中包装第三方库时才使用它),所以没有理由让它更容易使用。