【问题标题】:Ember afterRender not waiting for promisesEmber afterRender 不等待承诺
【发布时间】:2015-05-14 16:34:58
【问题描述】:

我想知道所有内容第一次渲染的时间,但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 或类似的检查,在所有的承诺都确定之后。

【问题讨论】:

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


    【解决方案1】:

    如果您要使用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 队列不经常使用(我只在将第三方库包装在组件中时使用它),因此没有理由让它更易于使用。

    【讨论】:

      猜你喜欢
      • 2019-04-29
      • 2019-12-10
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      • 1970-01-01
      • 2017-06-17
      相关资源
      最近更新 更多