Preventing memory leaks in Backbone.js
paydirtapp.com
paydirtapp.com
Even without that uncertainty, it's definitely a bit tricky to move to thinking about everything being in the browser.
It doesn't make much sense for tutorials to be written in coffeescript unless they are specifically coffeescript tutorials
Writing a tutorial / informative blog post in coffeescript is like : Giving an English lesson in Chinese while teacher and students are native speakers of English.
Emberjs makes building non-trivial easy while backbone makes building non-trivial apps hard but makes building small simple app easy.
People like talking about the size of emberjs but after you finishing stitching together numerous boilerplate code, you might end up with a bigger code base than emberjs and you are worst off as you have to maintain your boilerplate yourself rather than use a community curated codebase.
Two good getting started tutorial: http://trek.github.com/ http://emberjs.com/guides/router_primer/
Please i don't dislike backbonejs but we should use the right tool for the right job, backbone is not the right tool for non trivial app except you like boilerplate code. I also respect Jeremy Ashkenas. So my comments are not hate induced.
"Backbone is the wrong tool for anything non-trivial" is just hyperbole.
https://github.com/emberjs/ember.js/wiki/Production-Deployme...
Shopitome is a very fresh deployment using emberjs based on this tweet sent today:
http://twitter.com/inkredabull/status/268017623428657153
http://www.shopittome.com/threads/signup
A few non trivial companies using emberjs in production are:
www.zendesk.com
Ember applications start out with a complexity rating of 4/10 but never get much higher than 6/10, regardless of how sophisticated your application becomes. Backbone starts out at 1/10 but complexity grows linearly. This is a natural side effect of the types of applications the two frameworks were specifically created for.
https://github.com/emberjs/data
http://emberjs.com/guides/ember-data-lifecycle/
https://speakerdeck.com/tomdale/30 slides for the video below
http://www.youtube.com/watch?v=djhAsWGOImk Tom Dale - Ember-data
https://github.com/thoughtbot/backbone-support
It has a CompositeView and a SwappingRouter that you should use in place of Backbone.View and Backbone.Router
https://github.com/chaplinjs/chaplin
Simplified router, subviews, model binding techniques like described in the OP are all helpfully baked in.
1. myModel.on('change:title', this.render, this); // inside `myView`
2. myView.dispose(); // when you are done with `myView`
This will automatically remove all the referenced binds onto `myView` and simply removing the root view as OP mentions is sufficient.Backbone is a real pitfall here in larger projects and you have to keep memory leaks in mind when using Backbone events. (sadly JavaScript has no WeakMaps yet, which would solve the problem for us) That's why projects like Backbone Marionette or EventBinder exists which are handling the Backbone events leaking problem better than bare bones Backbone alone. See http://lostechies.com/derickbailey/2011/09/15/zombies-run-ma...
In a very large application I'm writing at the moment I've introduced a common View parent class which extends Backbone views with proper subview handling and correct event disposal. So in my views I can write something like this (works very similar to the Backbone view's DOM "event" mapping field, but instead of DOM events we are talking about Backbone events here) [Edit: well, looking at the submission article, that's very similar to the solution described in the article]
objectEvents: {
'model change': 'reload',
'collection reset': 'render'
}
Then my View class handles the rest: it connects the events in the constructor and disconnects them correctly on remove(). The only thing you have to keep in mind is that you have to remove all old subviews explicitly when they get recreated. That's when my subview handling kicks in, because I have some helper methods like addSubView and removeAllSubViews which get called when re-rendering the parent view.Backbone subview handling can be a real pain and memory management has to be kept in mind. Every time you are using the "on"-method you should ask yourself when this event gets destroyed and if it could lead to a memory leak. Or you should use something like EventBinder. https://github.com/marionettejs/backbone.eventbinder
Which is one of the main reasons why EmberJS was created.
Sometimes I wonder why backbone is still getting so much love when saner alternatives (Ember, Angular etc.) have been around for so long.
Is it only inertia or is there perhaps a need for a framework in the middleground between backbone and ember (in terms of abstraction)?
Always worth considering using a framework layer like Marionette to help you with architecture. Otherwise you will end up writing something similar to it yourself. Which sometimes is necessary, but not always.
This is fixed by ensuring there's an off()/unbind() for every on()/bind(). I do this by following a pattern like the one in this article: http://lostechies.com/derickbailey/2011/09/15/zombies-run-ma...
The problem is, you have a bunch of subviews which are registering events on some collection models... when you rerender your parent view your subviews get recreated but your previously created subviews stay in memory because the backbone events system still stores references to the old views which aren't really needed anymore. The only solution is to explicitly remove the events when subviews a destroyed (or better use a solution like in the submitted article) or use a library like https://github.com/marionettejs/backbone.eventbinder