当然我读了手册,但正如我在经典例子中看到的那样,如果我用绑定来评论这条线,它并没有真正有所作为。现在默认绑定方法吗?
(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);
答案 0 :(得分:3)
是的,'此'默认绑定到Backbone View附加的所有功能的View,不再需要手动绑定。
答案 1 :(得分:3)
Jax是对的,您不必在最新版本的Backbone(目前的1.1.0)中手动绑定View方法和事件。有些早期版本也是如此,但我不记得是哪些版本。
在某些情况下,您需要绑定视图方法才能使它们正常工作。这些案例是基本的Javascript范围,并且与Backbone JS无关。
最好不要使用_.bindAll
。相反,如果您使用的是Underscore JS,则应使用_.bind
逐个绑定。
实际上,如果您使用的是Backbone,则也不需要使用_.bind
。 Backbone Events
类上有快捷方法。这意味着您也可以在Collection
和Model
类中使用这些快捷方式,因为它们每个都基本上混合了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文档更喜欢on
和off
到bind
和unbind
。
这里有两个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/