Backbone click event not firing on dynamic view

backbone.js, javascript, jquery

Solution

There are some things that might be the cause of the problem.

First of all, your `el` declaration seems to be suspect. If you want a div with that class you just have to define the `className` attribute since the default for backbone views is `div`.

Instead of: `el: '<div class="vendor-video" />'`

just use: `className: 'vendor-video'`

I don't see any details about your view initialization methods but the best practice is to initialize a view and then render it to the container:

var yourVideoDivView = new videoDivView({model: model});
$("#your-video-container").html(yourVideoDivView.render().el)

also to get the last line work you have to `return this;` on your render method.

render: function(){
  ...
  return this;
}

About using `this.delegateEvents()`, you should call this function after your view is already in the `DOM` otherwise it makes no sense. ie:

$("#your-video-container").html(yourVideoDivView.render().el)
yourVideoDivView.delegateEvents();

`delegateEvents()` will makes your view events alive again.

Problem

I have a backbone view that creates a new div for each model that is passed into it. However, I cannot get any sort of events to fire (click a.change-status) on the view and I assume it's because the elements inside of it are also generated from a template. Please let me know if there's some way around this. ``` var videoDivView = Backbone.View.extend({ el: '<div class="vendor-video" />', initialize: function(){ _.bindAll(this); this.render(); this.model.on('change:published', this.enableSaveButton); }, events: { 'click a.change-status' : 'changeVideoStatus' }, template: video_tmpl, render: function(){ this.$el.attr("id", 'video-'+this.model.id); this.$el.html(this.template(this.model.toJSON())); this.$el.data('status', video_statuses[this.model.get('published')]); }, changeVideoStatus: function(e) { console.log(this.model); return false; }, enableSaveButton: function() { $('#save-changes').removeClass('disabled').removeAttr('disabled'); } }); ``` an example template would look like: ``` <script id="single-video-tmpl" type="text/x-jquery-tmpl"> <div> <div class="video-info"> <span class="video-title"><%=video_title%></span> <div class="bottom-info"> <a href="#<%=id%>" class="change-status"></a> </div> </div> </div> </script> ```

Original source