web-dev-qa-db-fra.com

Détruire ou supprimer une vue dans Backbone.js

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?

81
Ad Taylor

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();
};
47
joshvermaire

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.

161
sdailey

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

20
Bassam Mehanni

C'est ce que j'ai utilisé. N'a pas vu de problèmes.

destroy: function(){
  this.remove();
  this.unbind();
}
8
JT703

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.

4
Dre

Je pense que cela devrait fonctionner

destroyView : function () {
    this.$el.remove();
}
0
Chhorn Ponleu

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]);
}
0
Deot