J'ai toujours nuke les points de vue et parfois la réutilisation des modèles. Assurez vous que les points de vue sont désalloués peut être une douleur, si vous gardez les modèles autour de. Les modèles peuvent conserver une référence à la vue, si ils ne sont pas indépendant correctement.
Comme d'épine Dorsale ~0.9.9, modèles de liaison avec vue.listenTo() plutôt que de modèle.() facilite le nettoyage par inversion de contrôle (contrôle des liaisons par opposition à des modèles). Si la vue.listenTo() est utilisée pour lier, puis un appel à vue.stopListening() ou de la vue.remove() va supprimer toutes les liaisons. Similaire à l'appel du modèle.off(null, null, ce).
J'aime le nettoyage des vues en élargissant le point de vue d'une fonction de fermeture qui appelle les sous-vues de façon semi-automatique. Les sous-vues doivent être référencées par les propriétés de la mère ou ils doivent être ajoutés à un tableau à l'intérieur de la mère a appelé childViews[].
Ici est la fonction que j'utilise..
// fired by the router, signals the destruct event within top view and
// recursively collapses all the sub-views that are stored as properties
Backbone.View.prototype.close = function () {
// calls views closing event handler first, if implemented (optional)
if (this.closing) {
this.closing(); // this for custom cleanup purposes
}
// first loop through childViews[] if defined, in collection views
// populate an array property i.e. this.childViews[] = new ControlViews()
if (this.childViews) {
_.each(this.childViews, function (child) {
child.close();
});
}
// close all child views that are referenced by property, in model views
// add a property for reference i.e. this.toolbar = new ToolbarView();
for (var prop in this) {
if (this[prop] instanceof Backbone.View) {
this[prop].close();
}
}
this.unbind();
this.remove();
// available in Backbone 0.9.9 + when using view.listenTo,
// removes model and collection bindings
// this.stopListening(); // its automatically called by remove()
// remove any model bindings to this view
// (pre Backbone 0.9.9 or if using model.on to bind events)
// if (this.model) {
// this.model.off(null, null, this);
// }
// remove and collection bindings to this view
// (pre Backbone 0.9.9 or if using collection.on to bind events)
// if (this.collection) {
// this.collection.off(null, null, this);
// }
}
Ensuite, d'un point de vue est déclarée comme suit..
views.TeamView = Backbone.View.extend({
initialize: function () {
// instantiate this array to ensure sub-view destruction on close()
this.childViews = [];
this.listenTo(this.collection, "add", this.add);
this.listenTo(this.collection, "reset", this.reset);
// storing sub-view as a property will ensure destruction on close()
this.editView = new views.EditView({ model: this.model.edits });
$('#edit', this.el).html(this.editView.render().el);
},
add: function (member) {
var memberView = new views.MemberView({ model: member });
this.childViews.push(memberView); // add child to array
var item = memberView.render().el;
this.$el.append(item);
},
reset: function () {
// manually purge child views upon reset
_.each(this.childViews, function (child) {
child.close();
});
this.childViews = [];
},
// render is called externally and should handle case where collection
// was already populated, as is the case if it is recycled
render: function () {
this.$el.empty();
_.each(this.collection.models, function (member) {
this.add(member);
}, this);
return this;
}
// fired by a prototype extension
closing: function () {
// handle other unbinding needs, here
}
});