您有两个问题使您initialize无法工作:
- 范围内没有
printText。
_.bind并且_.bindAll表现不同。
第一个很容易修复,你想用this.printText,而不仅仅是printText。
_.bind将单个函数绑定到 athis并返回该绑定函数;_.bindAll另一方面,将多个命名函数绑定到 athis并将绑定的函数附加到指定的this. 所以,这样做:
_.bind(printText, this);
当您丢弃绑定函数时,它没有做任何有用的事情。你想这样做:
this.printText = _.bind(this.printText, this);
或者在 Backbone 应用程序中更常见的是,您会使用_.bindAll:
_.bindAll(this, 'printText');
现在你有一个功能initialize,你将拥有this里面的权利printText,我们可以继续修复printText。我认为您想从<li>单击的文本中提取文本;你可以这样做:
printText: function(ev) {
console.log($(ev.target).text());
}
但这仍然行不通,我们想知道这里发生了什么。好吧,Backbone 将事件绑定到视图el,所以让我们看一下:
var print = Backbone.View.extend({
el : $('ul li.newItem'),
//...
当它Backbone.View.extend运行时,DOM 中不会有任何li.newItem元素,因此您不会el在该视图中获得有用的信息。这里通常的方法是有一个看起来像这样的视图:
var Print = Backbone.View.extend({
tagName: 'li',
events: {
'click': 'printText'
},
render: function() {
this.$el.text('Hello world ' + this.options.i);
return this;
},
printText: function(e){
console.log($(e.target).text());
}
});
我们设置tagName并'li'让 Backbone<li>自己创建。然后我们将计数器值Print作为参数传递给视图,this.options.i当我们说new Print({ i: ... }).
现在我们只需要调整addItem你的方法ListView来创建新Print的并将它们添加到<ul>:
addItem: function(){
this.counter++;
var v = new Print({ i: this.counter });
this.$('ul').append(v.render().el);
}
更新演示:http: //jsbin.com/evoqef/10/edit
我还进行了一些其他更改:
- 使用
this.$el而不是$(this.el),无需创建已经可用的东西。
- 使用
this.$()而不是$('ul', this.el),相同的结果,但this.$()不会在$()函数调用结束时隐藏上下文,并且this.$()在 Backbone 中更惯用。