Javascript 在主干视图中调用render()方法的好方法

Javascript 在主干视图中调用render()方法的好方法,javascript,backbone.js,Javascript,Backbone.js,很久以前,我有点确信render()是视图本身的特权,而不是父视图的问题 然而,最近我在主干网中读到了delegateEvents,对如何实现有着复杂的感觉。到目前为止,我在initialize方法中调用render() 我没有做过详尽的测试,也没有发现我可能面临问题的用例。然而,它给了我一种潜在问题潜伏在我所做的方式中的感觉 你能分享一下你的经验吗?在initialize中调用render()方法有什么问题?你会怎么做 父母是否在命令孩子何时何地呈现自己?是否仍在SoC(关注点分离)的范围内

很久以前,我有点确信
render()
是视图本身的特权,而不是父视图的问题

然而,最近我在主干网中读到了
delegateEvents
,对如何实现有着复杂的感觉。到目前为止,我在
initialize
方法中调用
render()

我没有做过详尽的测试,也没有发现我可能面临问题的用例。然而,它给了我一种潜在问题潜伏在我所做的方式中的感觉

你能分享一下你的经验吗?在
initialize
中调用
render()
方法有什么问题?你会怎么做


父母是否在命令孩子何时何地呈现自己?是否仍在SoC(关注点分离)的范围内

基本上,我看到了3种不同的渲染场景,前两种是父级渲染中的渲染

// parent view's render
render: function() {
  var child = new ChildView({el: this.$('.foo'), model: bar, ...});
  this.$el.append(child.render().el);
}
这基本上就是父对象指定子对象渲染的位置或时间以及渲染本身的情况

// parent view's render
render: function() {
  var child = new ChildView({el: this.$('.foo'), model: bar, ...});
  this.$el.append(child.el);
}

// child view's initialize
initialize: function() {
  ...
  this.render();
}
在这种情况下,子视图指示渲染完成的时间。我的意见是后者更好。应该安排应用程序,以便只有视图本身知道何时应该呈现它(应该在初始化或获取模型/集合之后)。在
initialize
中调用
render
没有发现任何问题,即使在它之后调用了
delegateEvents
。填充
el
不会对其功能产生任何影响

initialize
中调用
render
是一种很好的做法,因为它可以在任何情况下工作,并统一渲染方式(您将添加在获取后以与其他视图相同的方式进行渲染的视图)。我没有遇到任何问题,这样做渲染还没有,显然你也没有

希望这对你有帮助(或者让你放心)

“…很久以前,我有点相信render()是视图本身的特权,而不是父视图。”

你在正确的轨道上。虽然人们通常将
render
视为公共方法,但您会发现从视图外部调用render只会导致意大利面代码和混乱


最佳实践是作为初始化的一部分进行渲染(或安排渲染),并响应相关模型上的适当事件。

在编写单元测试时,在initialize中进行渲染调用可能是一件非常痛苦的事情。考虑到每一个测试都可能构造视图来测试它的一个方法,如果那个视图然后试图渲染你需要1个)每次渲染,或者2)对齐事物,以便渲染不会破坏任何东西。无论哪种情况,都不是你想处理的事情。