85 votes

Détruire ou supprimer une vue dans Backbone.js

J'essaie actuellement de mettre en œuvre une méthode de destruction/suppression pour les vues, mais je n'arrive pas à trouver une solution générique qui fonctionne 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 arrive, les vues précédentes soient détruites. puis charge les nouveaux.

Existe-t-il un moyen de faire cela sans avoir à construire une fonction de suppression pour chaque vue ?

0 votes

Pouvez-vous donner un exemple de ce qu'est l'écosystème de votre vision ? Votre question me fait penser qu'il y a plusieurs vues sur la page en même temps. Je n'arrive pas à visualiser ce que vous essayez de faire et je ne peux donc pas vous donner une réponse qui pourrait répondre à vos besoins.

1 votes

D'autres modèles à partir de ces grands postes : lostechies.com/derickbailey/2011/09/15/ coenraets.org/blog/2012/01/

162voto

sdailey Points 1255

Je devais être absolument sûr que la vue n'était pas seulement supprimée du DOM mais aussi complètement déconnectée 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 fait l'affaire.

10 votes

D'après ce que j'ai vu, this.remove() devrait appeler la fonction remove de jQuery, qui devrait supprimer l'élément du DOM, mais aussi les données et les événements qui lui sont attachés. Je suppose donc que l'appel à undelegateEvents et removeData ne devrait pas être nécessaire... Est-ce que j'ai raison ?

1 votes

@opensas Les événements persistaient au-delà de this.remove() malgré la suppression de l'élément du DOM. this.undelegateEvents() était nécessaire pour que tous les événements se détachent. Comme je l'ai dit, c'était un peu exagéré, mais cela a fait l'affaire.

3 votes

Je l'aime bien. Même si tu devrais utiliser this.$el au lieu de $(this.el) ;)

48voto

joshvermaire Points 892

Sans connaître toutes les informations... Vous pourriez lier un trigger de reset à votre modèle ou contrôleur :

this.bind("reset", this.updateView);

et quand vous voulez réinitialiser les vues, déclenchez une réinitialisation.

Pour votre callback, faites quelque chose comme :

updateView: function() {
  view.remove();
  view.render();
};

5 votes

Je ne pense pas que ce soit juste. La fonction remove de la vue supprime simplement l'élément de cette vue du DOM ( ver aquí ). Je pense que ce type veut supprimer complètement l'objet de vue.

2 votes

This.remove() finit par appeler remove() de jquery, qui supprime également les données et les événements... Néanmoins, je pense que vous devez également appeler this.undelegateEvents pour vous délier d'autres événements, comme les événements personnalisés ou les modifications du modèle...

21 votes

this.remove() appelle this.stopListening() y this.$el.remove() . La première supprime tous les récepteurs d'événements ajoutés à l'aide de la fonction this.listenTo(...) . La seconde supprime tous les écouteurs d'événements ajoutés à l'aide de jQuery. Entre les deux, vous devriez être couvert, sauf si vous avez utilisé un autre moyen d'ajouter des écouteurs d'événements. Donc cette réponse est correcte et obtient +1 de ma part.

20voto

Bassam Mehanni Points 9118

Je sais que je suis en retard, mais j'espère que cela sera utile à quelqu'un d'autre. Si vous utilisez backbone v0.9.9+, vous pouvez utiliser, listenTo y 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 lire plus aquí y aquí

8voto

JT703 Points 515

C'est ce que j'ai utilisé. Je n'ai vu aucun problème.

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

5voto

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X