您有两个问题使您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 中更惯用。