Skip to content

Instantly share code, notes, and snippets.

@mxriverlynn
Created September 15, 2011 15:37
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save mxriverlynn/1219582 to your computer and use it in GitHub Desktop.
Save mxriverlynn/1219582 to your computer and use it in GitHub Desktop.
zombies! run!
MyView = Backbone.View.extend({
events: {
"click #someButton": "doThat",
"change #someInput": "changeIt"
},
doThat: function(){ ... },
changeIt: function(){ ... }
});
MyView = Backbone.View.extend({
initialize: function(){
this.model.bind("change", this.render, this);
},
render: function(){ ... }
});
MyView = Backbone.View.extend({
initialize: function(){
this.options.vent.bind("app:event", this.render, this);
},
render: function() { ... }
});
var vent = new _.extend({}, Backbone.Events);
new MyView({vent: vent});
vent.trigger("app:event");
MyRouter = Backbone.Router.extend({
routes: {
"": "home",
"post/:id": "showPost"
},
home: function(){
var homeView = new HomeView();
$("#mainContent").html(homeView.render().el);
},
showPost: function(id){
var post = posts.get(id);
var postView = new PostView({model: post});
$("#mainContent").html(postView.render().el);
}
});
function AppView(){
this.showView(view) {
if (this.currentView){
this.currentView.close();
}
this.currentView = view;
this.currentView.render();
$("#mainContent").html(this.currentView.el);
}
}
MyRouter = Backbone.Router.extend({
routes: {
"": "home",
"post/:id": "showPost"
},
initialize: function(options){
this.appView = options.appView;
},
home: function(){
var homeView = new HomeView();
this.appView.showView(homeView);
},
showPost: function(id){
var post = posts.get(id);
var postView = new PostView({model: post});
this.appView.showView(postView);
}
});
Backbone.View.prototype.close = function(){
this.remove();
this.unbind();
}
Backbone.View.prototype.close = function(){
this.remove();
this.unbind();
if (this.onClose){
this.onClose();
}
}
MyView = Backbone.View.extend({
initialize: function(){
this.model.bind("change", this.render, this);
},
render: function(){ ... },
onClose: function(){
this.model.unbind("change", this.render);
}
});
@eskimoblood
Copy link

At your last example, wouldn' it be better to have an event object for models and/or collections like the one for the DOM events. Then you have a start and stop method where you can simple bind/unbind this events automatically. Its inspired by the architecture of GWT where every activity has a start and an optional stop method. https://gist.github.com/1410703

@mxriverlynn
Copy link
Author

at the time I wrote this, that idea hadn't crossed my mind... but I'm doing basically that, now. it works really well. I'm using a combination of both techniques, depending on the situation.

@eskimoblood
Copy link

Btw, is it really necessary to delete the DOM events. Aren't they gone when the element is deleted?

@mxriverlynn
Copy link
Author

i don't know if remove the elements from the DOM would clean them up directly or not. i know calling this.remove() will force jquery to clean them up and i can only imagine that jquery implemented the DOM event cleanup for a reason... but i don't know for sure

@philfreo
Copy link

You're missing the word function in 5-appview.js (this.showView(view) {)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment