Binding Backbone change event to attribute of model in a collection

Jay picture Jay · Feb 5, 2013 · Viewed 30.3k times · Source

I have a view that takes a collection like below:

MyView = Backbone.View.extend({
    initialize: function() {
       this.collection.on("change://an attribute of a model in aCollectionToRender", someAction);
    }
});

var MyViewInstance = new MyView({
    collection: aCollectionToRender
});

Basically, I don't want MyView to listen for changes on the entire collection, only a single attribute of the model that the collection contains.

I realize there are a number of alternatives to this:

  1. Create views for each model of aCollectionToRender and attach .on("change") events in those views. I don't want to do this because it's not the right thing to do for my situation
  2. Just have a this.collection.on("change") event and have the event handler filter based on my requirements. This is less elegant, and if Backbone already allows me to write event filters as I asked above, this is duplicate code

I was just wondering if there's any way to write an event listener that already does the filtering. This question may also be a duplicate; I looked but I didn't find anything exactly like this, however, there are a lot of Backbone questions

Answer

Paul Hoenecke picture Paul Hoenecke · Feb 5, 2013

Maybe I am misunderstanding your question, but you can do exactly what you show. Check out the Backbone documentation.

MyView = Backbone.View.extend({
    initialize: function() {
       this.collection.on("change:attributeName", this.someAction /*function to call*/, this);
    },
    someAction: function(model, value, options){
    }
});