我感到困惑的结合和目的_bind.All
在Backbone.js的。 下面是创建一个模式视图中的工作代码#modal
,并呈现出意见从后端牵强。
首先,在下面的代码,我在initialize
功能_.bindAll(this, 'render', 'renderComments');
。 无论我做_.bindAll()
我没有问题调用this.render()
和this.renderComments()
内initialize()
是否有当任何实例_.bindAll()
会帮助我们,当它不会呢?
ModalView = Backbone.View.extend({
el: $('#modal'),
template: _.template( $('#tpl_modal').html() ),
initialize: function() {
_.bindAll(this, 'render', 'renderComments');
this.render();
this.renderComments();
},
render: function() {
$(this.el).fadeIn('fast').append( this.template( this.model.toJSON( this.model ) ) );
},
renderComments: function() {
this.commentList = new CommentCollection();
var self = this;
this.commentList.fetch({
data: { post_id: this.model.id},
processData: true,
success: function() {
self.commentListView = new CommentListView({ collection: self.commentList });
}
});
}
});
和
CommentListView = Backbone.View.extend({
el: '.modal_comments',
initialize: function() {
this.render();
},
render: function() {
var self = this;
this.collection.each( function(comment, index) {
$(self.el).append( new CommentListItemView({ model: comment }).render().el );
});
return this;
}
});
其次,我感到困惑的前面加上this.
的东西。 例如,在renderComments
,我为什么不能使用:
var commentList = new CommentCollection();
var self = this;
commentList.fetch({.... });
对于线this.commentList = new CommentCollection();
,比实例化类等CommentCollection()
它使commentList
的孩子ModalView
?
此外,是否有必要拥有var self = this;
并使用self.commentListView
在回调函数以后呢? 可以结合使用,以便我可以访问this.commentListView
,或使用var self = this
做事的传统方式?
最后,应该self.commentListView = new CommentListView({ collection: self.commentList });
在成功函数renderComments
被移动到CommentListView
的initialize方法,而不是和被绑定到this.collection.on('reset');
防止嵌套了过多的功能? 这将导致:
ModalView = Backbone.View.extend({
el: $('#modal'),
template: _.template( $('#tpl_modal').html() ),
initialize: function() {
_.bindAll(this, 'render', 'renderComments');
this.render();
this.renderComments();
},
render: function() {
$(this.el).fadeIn('fast').append( this.template( this.model.toJSON( this.model ) ) );
},
renderComments: function() {
this.commentList = new CommentCollection();
this.commentListView = new CommentListView({ collection: this.commentList });
this.commentList.fetch({
data: { post_id: this.model.id},
processData: true
});
}
});
CommentListView = Backbone.View.extend({
el: '.modal_comments',
initialize: function() {
this.collection.on('reset', this.render, this);
},
render: function() {
var self = this;
this.collection.each( function(comment, index) {
$(self.el).append( new CommentListItemView({ model: comment }).render().el );
});
return this;
}
});