emberjs - 解释scheduleOnce在这种情况下

时间:2015-09-25 10:22:54

标签: ember.js

我有一个嵌套组件,我需要它来重新渲染。首先,我试着简单地调用rerender方法:

modelUpdated: function() {
  this.rerender();
}

但我收到此错误消息:

  

您不能在渲染过程之外使用appendChild

解决方案是使用运行循环,但我很困惑为什么这样做:

modelUpdated: function(model){
  Ember.run.scheduleOnce('render', this, 'rerender')
}

我对scheduleOnce的理解是,如果一个不存在,它将创建一个运行循环,而rerender方法将在runloop的渲染队列中执行一次。

我很困惑为什么这会进入渲染队列并且解释会很棒。

1 个答案:

答案 0 :(得分:0)

  

我很困惑为什么会进入渲染队列

与渲染相关的操作进入渲染队列是正常的。渲染逻辑发生在渲染队列中。重新渲染与渲染密切相关,因此显而易见的是渲染队列。如果不渲染队列,它会去哪里?

The Run Loop guide获取队列描述:

  

渲染队列包含用于渲染的作业,这些将是   通常更新DOM

我认为我们可以同意rerender匹配job meant for rendering的定义,这通常会更新DOM。

DOM更新逻辑也可以转到afterRender队列:

  

afterRender队列包含要执行的作业   先前安排的渲染任务已完成。这通常是有益的   第三方DOM操作库,应该只在一个之后运行   整个DOM树已更新

rerender涉及原生的Ember DOM渲染逻辑,因此它无法在Ember渲染逻辑之后运行。

我们可以深入研究负责渲染/重新渲染组件的Ember源代码 - rerenderrender。两种方法都涉及 访问env.renderer Renderer class instance,通过深入了解它的源代码,我们可以看到它是Ember特定渲染逻辑的核心。