在BackboneJS中调用render()的适当方法

时间:2011-10-11 20:57:38

标签: javascript backbone.js

在我看过的大多数BackboneJS示例中,父视图在子视图上调用render()函数。这对我来说有点奇怪。也许它完全用于优化或其他什么,但我不明白为什么优化不能在子视图本身内发生。子视图不应该负责调用自己的render()吗?在我的所有观点中,我似乎最终得到了类似的东西:

initialize: function() {
    this.render();
}

此外,如果我的父视图更新子视图的model属性,那么孩子应该如何知道模型已更改(因此需要调用render())?我假设在这种情况下父母被迫调用孩子的render()。虽然有点推断,为什么父母需要知道孩子在模型改变时需要重新渲染?看起来调用子视图的render函数在父视图的域之外。

1 个答案:

答案 0 :(得分:13)

几乎与Backbone相关的一切,这是一个非常主观的问题。但是,您可能希望父母呈现以下几个原因:

  • 认为父视图可能需要确保在渲染的其余部分进行之前渲染子视图是完全合理的。例如,父级可能需要根据子级的大小调整容器元素的大小,或者只有在子视图的内容呈现时才显示容器。

  • 只有在您不需要先执行其他操作时,“初始化渲染”模式才有效 - 例如,一个常见模式是视图绑定到模型的change事件,调用this.model.fetch(),并在回调中呈现。在这种情况下,特别是如果你关心不同渲染的执行顺序,最好在父对象上有一个事件监听器然后让父对象渲染子对象,而不是与每个孩子绑定,即使这些孩子赢了不要打电话给fetch()

  • 此外,让父母渲染孩子不会排除孩子重新渲染自己,例如以回应更具体的事件。父母调用child.render()只是有助于确保在父母完成渲染时发生这种情况。

值得注意的是,render视图的默认禁止操作。所以父母可以给孩子打电话render(),而不必确定它会做什么。

在回答“如果父母改变孩子的模型怎么办?”时,一个选择是,不要这样做 - 总是为每个新模型创建一个新的孩子。但这可能不适合您的架构 - 在这种情况下让父母负责重新渲染孩子是完全合理的。