Reputation: 12132
I'm trying to learn Backbone.js. I've been stuck on this for a whole hour. I don't get why my event would not fire..
JSFIDDLE: http://jsfiddle.net/jancarlo000/ejn2J/
JSBIN: http://jsbin.com/efefip/3/edit
see ItemView the one starting on this section:
var ItemView = Backbone.View.extend({ ....
FULL CODE:
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]);
});
Upvotes: 0
Views: 979
Reputation: 11
This issue also can be solved by invoking this.delegateEvents(); after your view is built.
Upvotes: 1
Reputation: 33344
In your main view render
, you use $('body').html(this.el);
which replaces the views and their event handlers with unbound elements.
Removing this line and appending the main view el to the body in the initialize method gives the intended result
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;
}
});
And if I may, a few opinions
Upvotes: 4