[英]Backbonejs view binding conceptual feedback
我碰到了这篇文章( http://coenraets.org/blog/2012/01/backbone-js-lessons-learned-and-improved-sample-app/ ),并且想知道是否在实例化它们之后的路由器是最佳实践。 我一直在绑定我的视图并在我的视图定义中渲染它们。
目前,这是我一直在设置和调用视图的方式:
EmployeeView:
EmployeeView = Backbone.View.extend({
el: '#content',
template:template,
initialize: function () {
this.collection.fetch({
reset: true
});
this.collection.on('reset',this.render, this);
},
render: function(){
this.el.innerHTML = Mustache.to_html(this.template, { employee_list: this.collection.toJSON()});
console.log('render called');
}
我的路由器:
employeeList: function () {
var c = new EmployeeCollection
new EmployeeView( {
collection: c
});
}
工作正常。 但是根据本文,更好的做法是执行以下操作:
EmployeeView = Backbone.View.extend({
template:template,
initialize: function () {
this.collection.fetch({
reset: true
});
this.collection.on('reset',this.render, this);
},
render: function(){
this.el.innerHTML = Mustache.to_html(this.template, { employee_list: this.collection.toJSON()});
console.log('render called');
return this;
}
路由器
employeeList: function () {
var c = new EmployeeCollection
$('#content').html(new EmployeeView( {collection: c}).render().el);
},
我喜欢本文中的解决方案,因为如本文所述,它使视图与其他DOM事件脱钩,并使我可以将所有调整和自定义集中在一个地方,即路由器。 但是因为我传入了一个集合/模型,并且需要在初始化时获取数据,所以页面渲染两次。 我的问题是:
你说得差不多了。 您只是将其渲染两次,我认为这不是正确的方法,因为没有意义。
EmployeeView = Backbone.View.extend({
template:template,
initialize: function(){
console.log("Will print second");
this.collection.fetch({ reset: true });
this.collection.on('reset', this.appendEmployees, this);
},
render: function(){
//this.el.innerHTML = Mustache.to_html(this.template, { employee_list: this.collection.toJSON()});
console.log('Will print 3rd. render called');
return this;
}
appendEmployees: function(){
console.log("Will print 4th. Appending employees");
$(this.el).html(Mustache.to_html(this.template, {employee_list: this.collection.toJSON() });
}
})
路由器
employeeList: function () {
var c = new EmployeeCollection()
var view = new EmployeeView({ collection: c });
console.log("Will print 1st");
$('#content').html(view.render().el);
}
首先,当您执行view.render().el
,它将视图元素(到那时将为空)附加到#content
其次,当集合重置时,您正在执行appendEmployees
函数。 到这种情况发生时,您的元素将已经放置在DOM中。
如果需要刷新,可以在视图内部通过调用appendEmployees
函数,甚至重置集合来完成。 或者,如果您通过主干导航到相同的路线,则将重复整个过程,因此将再次调用您的集合,并且页面将从一开始就呈现。 因此,这取决于您何时/为什么选择一个而不是另一个的偏好。 希望这可以帮助。
您在这里拥有的视图与本文中的视图完全不同。
在您的示例中,视图绑定到DOM中的元素( #content
),
这不是一个好习惯,特别是对于初学者来说,这会导致很多错误,我们每天都在这里看到它们。
例如,如果您创建了2个视图实例,则事件将开始触发多次,并且所有地狱都会崩溃。
本文中的视图在每个实例的内存中创建一个新的<div>
元素,这是一个好习惯。
现在,加入这DOM,新手经常做的东西像下面的内部视图的渲染:
$('#content').html(this.$el);
这会在视图内部创建一个全局选择器,并使它意识到外部世界,这不是一个好习惯。
这篇文章(我没有读过)可能解决了这个问题,并提出了从路由器向DOM添加view元素的替代方法,我认为这是一个好习惯。
为了避免在文章的代码中呈现两次,您可以执行以下操作:
$('#content').html(new EmployeeView( {collection: c}).el);
el
是实时参考,获取成功后将对其进行更新。 .render().el
是由所有现有博客和教程传播的另一个常见误解。
旁注:由于我们正在讨论最佳实践,因此在var c = new EmployeeCollection
省略分号和括号也不是一个好习惯。 用var c = new EmployeeCollection();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.