Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 初始化子视图_Backbone.js_Underscore.js_Backbone Views - Fatal编程技术网

Backbone.js 初始化子视图

Backbone.js 初始化子视图,backbone.js,underscore.js,backbone-views,Backbone.js,Underscore.js,Backbone Views,我已经研究了一些代码一段时间了,无法决定在这种情况下应用的最佳实践: 假设我们有一个具有n个子视图的视图。我遇到了两种初始化它们的实践 1内部初始化 2内部渲染 现在这些只是粗糙的样本,但它们证明了我的困境。初始化还是渲染函数应该负责初始化子视图?就个人而言,我一直强烈支持后一个版本,但我看到的一些代码使我倾向于前一个版本 那么,在哪里初始化子视图,为什么在那里初始化,为什么它比另一个选项好?您应该最大限度地增加初始化中的工作量,因为这只会执行一次,并最大限度地减少您在呈现函数中所做的工作,例如

我已经研究了一些代码一段时间了,无法决定在这种情况下应用的最佳实践:

假设我们有一个具有n个子视图的视图。我遇到了两种初始化它们的实践

1内部初始化 2内部渲染 现在这些只是粗糙的样本,但它们证明了我的困境。初始化还是渲染函数应该负责初始化子视图?就个人而言,我一直强烈支持后一个版本,但我看到的一些代码使我倾向于前一个版本


那么,在哪里初始化子视图,为什么在那里初始化,为什么它比另一个选项好?

您应该最大限度地增加初始化中的工作量,因为这只会执行一次,并最大限度地减少您在呈现函数中所做的工作,例如在单页应用程序或响应网页中,呈现函数通常会被多次调用

如果您知道子视图的呈现方法永远不会更改生成的html,那么您也可以在initialize方法中调用子视图的呈现方法,只需在主视图中附加呈现元素


如果子视图和主视图的呈现方法在加载页面或其他内容时只调用一次,这可能与您的操作方式无关,但通常最小化呈现函数中要完成的工作量可能是一个好建议。

您应该最大化初始化中要完成的工作量,因为这将只执行一次,并最大限度地减少您在渲染功能中所做的工作量,渲染功能通常会被多次调用,例如在单页应用程序或响应网页中

如果您知道子视图的呈现方法永远不会更改生成的html,那么您也可以在initialize方法中调用子视图的呈现方法,只需在主视图中附加呈现元素


如果子视图和主视图的呈现方法在加载页面时只调用了一次,或者无论您如何操作,都可能不起作用,但是一般来说,最小化渲染函数中要完成的工作量可能是一个好建议。

我会将实际的子视图渲染功能完全放在一个新函数中,比如rendersubview

这将允许更大的灵活性

您可以从initialize或render调用此函数,并在应用程序增长/更改时轻松更改它。 您可以将此新函数绑定到事件,即视图的重置事件。 这更符合逻辑。初始化或渲染主视图时自动渲染子视图有意义吗?一个应该直接绑定到另一个吗?
我会将实际的子视图渲染功能完全放入一个新功能中,比如rendersubview

这将允许更大的灵活性

您可以从initialize或render调用此函数,并在应用程序增长/更改时轻松更改它。 您可以将此新函数绑定到事件,即视图的重置事件。 这更符合逻辑。初始化或渲染主视图时自动渲染子视图有意义吗?一个应该直接绑定到另一个吗?
initialize: function() {
  this.subViews = [];
  this.subViewModelCollection.each(function(model) {
    var view = new SubView({model: model});
    this.subViews.push(view);
    this.$el.append(view.el);
  }, this);
},

render: function() {
  _.invoke(this.subViews, 'render');
}
initialize: function() {
  ... // render handles the subviews
},

render: function() {
  this.subViews = [];
  this.subViewModelCollection.each(function(model) {
    var view = new SubView({model: model}).render(); // render optional
    this.subViews.push(view);
    this.$el.append(view.el);
  }, this);
}