Last active
August 29, 2015 14:01
-
-
Save sarink/db693b92a6e7c2fc1365 to your computer and use it in GitHub Desktop.
backbone.subviews
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// I wrote this when Backbone was like v0.2 - now there are many many tools like Marionette, | |
// and even things native to Backbone (like `stopListening`) that invalidate a lot of this | |
var SubView = Backbone.View.extend({ | |
// tagName: must be implemented | |
// className: must be implemented | |
// template: must be implemented | |
initialize: function() { | |
this.model.on("change", this.render, this); | |
this.model.on("close", this.close, this); | |
}, | |
render: function(options) { | |
console.log("rendering subview for",this.model.get("name")); | |
var defaultOptions = {}; | |
options = typeof options === "object" ? $.extend(true, defaultOptions, options) : defaultOptions; | |
this.$el.html(this.template({model: this.model.toJSON(), options: options})).fadeIn("fast"); | |
return this; | |
}, | |
close: function() { | |
console.log("closing subview for",this.model.get("name")); | |
this.model.off("change", this.render, this); | |
this.model.off("close", this.close, this); | |
this.remove(); | |
} | |
}); | |
var ViewCollection = Backbone.View.extend({ | |
// el: must be implemented | |
// subViewClass: must be implemented | |
initialize: function() { | |
var self = this; | |
self.collection.on("add", self.addSubView, self); | |
self.collection.on("remove", self.removeSubView, self); | |
self.collection.on("reset", self.reset, self); | |
self.collection.on("closeAll", self.closeAll, self); | |
self.collection.reset = function(models, options) { | |
self.closeAll(); | |
Backbone.Collection.prototype.reset.call(this, models, options); | |
}; | |
self.reset(); | |
}, | |
reset: function() { | |
this.$el.empty(); | |
this.render(); | |
}, | |
render: function() { | |
console.log("rendering viewcollection for",this.collection.models); | |
var self = this; | |
self.collection.each(function(model) { | |
self.addSubView(model); | |
}); | |
return self; | |
}, | |
addSubView: function(model) { | |
var sv = new this.subViewClass({model: model}); | |
this.$el.append(sv.render().el); | |
}, | |
removeSubView: function(model) { | |
model.trigger("close"); | |
}, | |
closeAll: function() { | |
this.collection.each(function(model) { | |
model.trigger("close"); | |
}); | |
} | |
}); | |
// usage | |
var PartView = SubView.extend({ | |
tagName: "tr", | |
className: "part", | |
template: _.template($("#part-row-template").html()) | |
}); | |
var PartListView = ViewCollection.extend({ | |
el: $("table#parts"), | |
subViewClass: PartView | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment