Skip to content

Instantly share code, notes, and snippets.

@bialecki
Created October 17, 2011 19:40
Show Gist options
  • Save bialecki/1293556 to your computer and use it in GitHub Desktop.
Save bialecki/1293556 to your computer and use it in GitHub Desktop.
Backbone View that listens to more events.
(function () {
// Cached regex to split keys for `delegate`.
var eventSplitter = /^(\S+)\s*(.*)$/;
var ExtendedView = Backbone.View.extend({
delegateViewEvents : function (events) {
if (!(events || (events = this.viewEvents))) return;
if (_.isFunction(events)) events = events.call(this);
this.undelegateViewEvents();
for (var key in events) {
var method = this[events[key]];
if (!method) {
throw new Error('Event "' + events[key] + '" does not exist');
}
var match = key.match(eventSplitter);
var eventName = match[1], selector = match[2];
if (selector === '') {
this.bind(eventName, method, this);
} else {
this[selector].bind(eventName, method, this);
}
}
}
});
// Example usage.
var SearchModel = Backbone.Model.extend();
var SearchView = ExtendedView.extend({
viewEvents: {
'search:start': '_hSearchStart',
'search:complete': '_hSearchComplete',
'change:results model' : '_hChangeResults'
},
_hSearchStart: function () { },
_hSearchComplete: function () { },
_hChangeResults: function (results, model) { }
});
var searchView = new SearchView({
el: document.getElementById('search-ui'),
model: new SearchModel()
});
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment