我正在尝试学习 Backbone.js 。我被困在这一整个小时。我不明白为什么我的活动不会开火......
JSFIDDLE:http://jsfiddle.net/jancarlo000/ejn2J/
JSBIN:http://jsbin.com/efefip/3/edit
参见ItemView 从本节开始的那个:
var ItemView = Backbone.View.extend({ ....
完整代码:
var Item = Backbone.Model.extend({ defaults: { Task: 'Study!'} });
var List = Backbone.Collection.extend({});
var MainView = Backbone.View.extend({
tagName: 'ul',
className: '',
initialize: function(){
_.bindAll(this, 'render');
window.list = new List();
window.list.bind('add', this.render, this);
},
render: function(model, collection, options){
var itemView = new ItemView({model:model});
$(this.el).append(itemView.el);
$('body').html(this.el);
return this;
}
});
//-------------- PROBLEM HERE -------------------------------
var ItemView = Backbone.View.extend({
tagName: 'li',
events: {
"click #deleteMe":"deleteMe" //<-- this doesn't fire!
},
initialize: function(){
_.bindAll(this, 'render');
this.render();
},
render: function(){
$(this.el).append(this.model.get('Task') +
'<button id="deleteMe">Delete Me</button>');
//WHY WON'T THIS FIRE!!!
return this;
},
deleteMe: function(e){
console.log('called deleteMe');
$(this.el).remove();
}
});
//------------------------------------------------------------
$(function(){
var app = new MainView();
var first = new Item({Task:'Learn JavaScript'});
var second = new Item({Task:'Learn HTML5'});
var third = new Item({Task:'Learn Backbone.JS'});
var fourth = new Item({Task:'Learn .NET MVC'});
list.add([first, second, third, fourth]);
});
答案 0 :(得分:4)
在主视图render
中,您使用$('body').html(this.el);
替换视图及其未绑定元素的事件处理程序。
删除此行并在initialize方法中将主视图el附加到主体上会得到预期的结果
var MainView = Backbone.View.extend({
tagName: 'ul',
className: '',
initialize: function(){
_.bindAll(this, 'render');
window.list = new List();
window.list.bind('add', this.render, this);
$('body').append(this.el);
},
render: function(model, collection, options){
var itemView = new ItemView({model:model});
$(this.el).append(itemView.el);
console.log($(this.el));
return this;
}
});
如果可以的话,还有一些意见
答案 1 :(得分:1)
这个问题也可以通过调用this.delegateEvents()来解决;建立视图后。