BackboneJS中调用render()的适当方式

7
在大多数我见过的BackboneJS例子中,父级视图会调用子视图上的render()函数。这对我来说有点奇怪。也许这完全是为了优化或其他一些原因,但我不明白为什么这种优化不能在子视图本身中实现。难道子视图不应该负责调用自己的render()吗?似乎在我所有的视图中,我最终都会得到像下面这样的内容:
initialize: function() {
    this.render();
}

此外,如果父视图更新了子视图的“model”属性,那么子视图应该如何知道模型已更改(因此需要调用“render()”)?我猜在这种情况下,父级被迫调用子级的“render()”。虽然这有点暗示,但为什么父级需要知道当其模型发生变化时子级需要重新渲染呢?似乎调用子视图的渲染函数是超出父视图领域的。
1个回答

13

像几乎所有与 Backbone 相关的内容一样,这是一个相当主观的问题。但是以下是您可能希望父级视图进行渲染的原因:

  • 认为父视图可能需要确保在其余部分进行呈现之前子视图已被呈现是完全合理的。例如,父级可能需要基于其子项的大小来调整容器元素的大小,或者仅在其内容由子视图呈现后才显示容器。

  • 您的“初始化时进行呈现”的模式仅在您不需要先执行其他操作时才起作用 - 例如,一个常见的模式是视图绑定到模型的 change 事件,调用 this.model.fetch() 并在回调中呈现。在这种情况下,特别是如果您关心不同呈现的执行顺序,有一个单独的父级事件监听器并让父级处理呈现子代更好,而不是与每个子代都建立绑定,即使那些子代不会调用 fetch()

  • 此外,父级呈现子级并不排除子级自己重新呈现,例如响应更具体的事件。父级调用 child.render() 只是有助于确保在父级完成呈现时已经发生这种情况。

还值得注意的是,视图默认情况下对于 render 没有操作。因此,父级可以调用子级的 render() 而无需确定它是否会执行任何操作。

对于“父级如何更改子级的模型”这个问题,一个选择是不要这样做 - 总是为每个新模型创建一个新的子级。但这可能不适合您的架构 - 在这种情况下,让父级负责重新呈现子级就是完全合理的。


谢谢您的回复!关于第一点:如果子元素在初始化、模型事件、DOM事件等之后总是立即重新渲染自己,那么它应该随时准备好让父视图对其进行任何操作,不是吗?第二点:我个人更喜欢每个子元素都观察模型,因为父元素不应该知道子元素关心模型。第三点:请参见对第一点的回复。仅因模型发生变化而创建新视图似乎效率低下。 - Aaronius
1
好的,就像我之前所说的那样,这是主观的 - Backbone并没有真正定义“正确”的做法。但就个人而言,我更倾向于假设父母知道并对他们的孩子负有责任。 - nrabinowitz
另外,第三点取决于应用程序。例如,您可以缓存以后的前一个视图。 - nrabinowitz
感谢您的见解。标记为正确答案。我很想听听其他人做这些事情的模式。 - Aaronius
1
我同意@nrabinowitz的答案,但我不太明白你所说的“模型更改”是什么意思。你是指用另一个模型替换模型吗?如果是这样,请参考此问题:https://dev59.com/d2sz5IYBdhLWcg3w8MYb。或者你是指你的模型属性已更改?如果是这样,那么你可以在你的子类initialize方法中添加这一行代码:this.model.bind('change', this.render, this);当模型内容更改时,Child将重新渲染。 - Johnny Oshika

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接