我有一个嵌套组件,我需要它来重新渲染。首先,我试着简单地调用rerender方法:
modelUpdated: function() {
this.rerender();
}
但我收到此错误消息:
您不能在渲染过程之外使用appendChild
解决方案是使用运行循环,但我很困惑为什么这样做:
modelUpdated: function(model){
Ember.run.scheduleOnce('render', this, 'rerender')
}
我对scheduleOnce
的理解是,如果一个不存在,它将创建一个运行循环,而rerender
方法将在runloop的渲染队列中执行一次。
我很困惑为什么这会进入渲染队列并且解释会很棒。
答案 0 :(得分:0)
我很困惑为什么会进入渲染队列
与渲染相关的操作进入渲染队列是正常的。渲染逻辑发生在渲染队列中。重新渲染与渲染密切相关,因此显而易见的是渲染队列。如果不渲染队列,它会去哪里?
从The Run Loop guide获取队列描述:
渲染队列包含用于渲染的作业,这些将是 通常更新DOM
我认为我们可以同意rerender
匹配job meant for rendering
的定义,这通常会更新DOM。
DOM更新逻辑也可以转到afterRender
队列:
afterRender队列包含要执行的作业 先前安排的渲染任务已完成。这通常是有益的 第三方DOM操作库,应该只在一个之后运行 整个DOM树已更新
但rerender
涉及原生的Ember DOM渲染逻辑,因此它无法在Ember渲染逻辑之后运行。
我们可以深入研究负责渲染/重新渲染组件的Ember源代码 - rerender,render。两种方法都涉及
访问env.renderer
Renderer
class instance,通过深入了解它的源代码,我们可以看到它是Ember特定渲染逻辑的核心。