绑定和_.bindAll Backbone.js的中(Binding and _.bindAll i

2019-09-19 06:33发布

我感到困惑的结合和目的_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;
    }
});

Answer 1:

唷 - 长的问题(S))

1)我以前做_.bindAll当我第一次使用骨干在我的初始化方法,但因为我已经停了下来。 它通常不需要,除非你绑定事件,然后它真的有用。 例如,如果您有:

events:
{
    'click': clickHandler
},
clickHandler: function(){
    //do cool stuff
}

然后它有助于做_.bindAll(this, 'clickHandler')否则你this指针不会视图

2)如果我理解你的问题: commentList成为您的实例的属性ModalView

3)使用var self = this; 是相对常见的,但在许多情况下可在Underscore.js可以避免由于过载(这是Backbone.js的的依赖性)。 例如,大多数的采集功能( mapeach等)需要上下文作为最后一个参数。 所以不是

var self = this;
_.map([1,2], function(item){
    self.sum = self.sum + item; 
});

你可以做:

_.map([1,2], function(item){
    this.sum = this.sum + item; 
}, this);

如果你的情况,你可以取代你的success有方法

success: _.bind(function() {
             this.commentListView = new CommentListView({ collection: this.commentList });
         }, this);

如果你想在这个指针的有点混乱问题的更多信息,它表明以下优秀教程: http://bonsaiden.github.com/JavaScript-Garden/#function.this

4)是的-我会渲染移动到reset 。 这样,如果别的东西导致收集的复位视图将它捡起来。

希望我回答你所有的问题。



文章来源: Binding and _.bindAll in backbone.js