J'essaie actuellement de mettre en œuvre une méthode de suppression/suppression pour les vues, mais je ne parviens pas à utiliser une solution générique pour toutes mes vues.
J'espérais qu'il y aurait un événement à attacher au contrôleur, de sorte que, lorsqu'une nouvelle requête parviendrait, les vues précédentes seraient détruites alors chargera les nouvelles.
Est-il possible de le faire sans avoir à créer une fonction de suppression pour chaque vue?
Sans connaître toutes les informations ... Vous pouvez lier un déclencheur de réinitialisation à votre modèle ou à votre contrôleur:
this.bind("reset", this.updateView);
et lorsque vous souhaitez réinitialiser les vues, déclenchez une réinitialisation.
Pour votre rappel, faites quelque chose comme:
updateView: function() {
view.remove();
view.render();
};
Je devais être absolument sûr que la vue n'était pas seulement supprimée de DOM, mais également totalement indépendante des événements.
destroy_view: function() {
// COMPLETELY UNBIND THE VIEW
this.undelegateEvents();
this.$el.removeData().unbind();
// Remove view from DOM
this.remove();
Backbone.View.prototype.remove.call(this);
}
Cela m'a semblé excessif, mais d'autres approches n'ont pas complètement fait l'affaire.
Je sais que je suis en retard à la fête, mais j'espère que cela sera utile pour quelqu'un d'autre. Si vous utilisez Backbone v0.9.9 +, vous pouvez utiliser listenTo
et stopListening
.
initialize: function () {
this.listenTo(this.model, 'change', this.render);
this.listenTo(this.model, 'destroy', this.remove);
}
stopListening
est appelé automatiquement par remove
. Vous pouvez en lire plus ici et ici
C'est ce que j'ai utilisé. N'a pas vu de problèmes.
destroy: function(){
this.remove();
this.unbind();
}
Selon la documentation actuelle de Backbone ....
view.remove ()
Supprime une vue et son el du DOM et appelle stopListening pour supprimer tous les événements liés que la vue a écoutés.
Je pense que cela devrait fonctionner
destroyView : function () {
this.$el.remove();
}
Vous pouvez utiliser le moyen de résoudre le problème!
initialize:function(){
this.trigger('remove-compnents-cart');
var _this = this;
Backbone.View.prototype.on('remove-compnents-cart',function(){
//Backbone.View.prototype.remove;
Backbone.View.prototype.off();
_this.undelegateEvents();
})
}
Une autre façon: créer une variable globale, comme ceci: _global.routerList
initialize:function(){
this.routerName = 'home';
_global.routerList.Push(this);
}
/*remove it in memory*/
for (var i=0;i<_global.routerList.length;i++){
Backbone.View.prototype.remove.call(_global.routerList[i]);
}