是`bindAll`已经过时了吗?

时间:2014-02-05 04:09:59

标签: javascript backbone.js

当然我读了手册,但正如我在经典例子中看到的那样,如果我用绑定来评论这条线,它并没有真正有所作为。现在默认绑定方法吗?

(function($){
    var ListView = Backbone.View.extend({
        el: $('#TheList'), // el attaches to existing element
        events: {
            'click button#add': 'addItem'
        },

        initialize: function(){
            // _.bindAll(thathis, 'render', 'addItem'); // every function that uses 'this' as the current object should be in here

            this.counter = 0; // total number of items added thus far
            this.render();
        },

        render: function(){
            $(this.el).append('<button id="add">Add list item</button>');
            $(this.el).append('<ul></ul>');
            // console.log(this);
            // console.log(this.el);
        },

        addItem: function(){
            this.counter++;
            $('ul', this.el).append('<li>hello world'+this.counter+'</li>');
        }
    });

    var listView = new ListView();

})(jQuery);

2 个答案:

答案 0 :(得分:3)

是的,''默认绑定到Backbone View附加的所有功能的View,不再需要手动绑定。

答案 1 :(得分:3)

Jax是对的,您不必在最新版本的Backbone(目前的1.1.0)中手动绑定View方法和事件。有些早期版本也是如此,但我不记得是哪些版本。

在某些情况下,您需要绑定视图方法才能使它们正常工作。这些案例是基本的Javascript范围,并且与Backbone JS无关。

最好不要使用_.bindAll。相反,如果您使用的是Underscore JS,则应使用_.bind逐个绑定。

实际上,如果您使用的是Backbone,则也不需要使用_.bind。 Backbone Events类上有快捷方法。这意味着您也可以在CollectionModel类中使用这些快捷方式,因为它们每个都基本上混合了Events类。

您需要在视图类中将侦听器附加到集合或模型。

this.collection.on('add', this.appendItem, this);

this.model.on('change', this.render, this);

第三个参数将视图对象范围绑定到render方法。如果没有这个,我将使用我相信的模型范围调用render方法。

另外,您也可以这样做:

this.collection.bind('add', this.appendItem, this);

on方法实际上是bind的别名,但我认为使用on更清楚。使用bind可能会造成混淆。看起来Backbone文档更喜欢onoffbindunbind

这里有两个jsFiddles,说明了我在说什么。我的示例在本教程示例中进行了修改:http://arturadib.com/hello-backbonejs/docs/5.html

本教程实际上已经存在很长时间了,所以可能不是最好用的。它看起来似乎有点更新,因为它确实使用了Backbone 1.10。我还要注意它使用_.bindAll

版本1正确使用绑定:http://jsfiddle.net/ChTjs/

此处的相关方法:

initialize: function() {
    this.collection = new List();
    this.collection.on('add', this.appendItem, this);
    this.collection.on('add', this.updateCount, this);
    this.collection.on('remove', this.updateCount, this);
    this.counter = 0;
    this.render();
},

在这里:

this.model.on('change', this.render, this);
this.model.on('remove', this.unrender, this);

这是一个jsFiddle版本,它不会将视图范围绑定到回调。 http://jsfiddle.net/LpEW8/1/

尝试一下,然后慢慢添加绑定以使代码再次运行。我刚刚意识到这实际上是在Backbone文档中提到的。搜索Binding "this"

编辑2

刚才意识到使用listenTo方法会更好。这里的优点是您将回调始终绑定到调用listenTo的视图/对象。因此,在使用this时无需传递on。额外的好处是将自动删除侦听器,而使用on

时不是这种情况。

所以不要这样:

this.collection.on('add', this.appendItem, this);
this.collection.on('add', this.updateCount, this);
this.collection.on('remove', this.updateCount, this);

您在视图中执行此操作:

this.listenTo(this.collection, 'add', this.appendItem);
this.listenTo(this.collection, 'add', this.updateCount);
this.listenTo(this.collection, 'remove', this.updateCount);

以下是Backbone文档中listenTo的锚点链接:http://backbonejs.org/#Events-listenTo

这里还有一个更新的小提琴:http://jsfiddle.net/ChTjs/2/