2013-05-17 2 views
0

Nous utilisons des vues Backbone pour améliorer notre application, et l'architecture de notre application nous oblige à attacher nos vues aux éléments DOM existants.Comment détacher une vue Backbone d'un élément sans affecter le DOM?

Nous avons récemment rencontré une situation dans laquelle il est nécessaire de détacher une vue Backbone d'un élément DOM sans supprimer l'élément DOM lui-même. Ainsi, nous ne pouvons pas utiliser View.remove() car il appellera à son tour this.$el.remove();

J'avais initialement créé la méthode suivante pour détacher la vue, mais je crains que je causer une fuite de mémoire:

detach: function() { 
    this.stopListening(); 
    this.unbind(); 
    this.setElement(null); 
} 

Cela remplace efficacement l'élément de la vue avec un objet jQuery vide, et il délie tous les événements Backbone. Cependant, il m'est apparu que jQuery pourrait stocker une référence au nouvel objet vide. Je ne suis pas tout à fait clair sur les internes de jQuery donc je ne peux pas commenter sur l'efficacité de cette méthode.

Je me suis alors modifié la méthode comme suit:

detach: function() { 
    this.stopListening(); 
    this.unbind(); 
    this.undelegateEvents(); 
    this.el = null; 
    this.$el = null; 
} 

Je pense que ce mieux d'obtenir le résultat souhaité car il supprime toutes les références au DOM et à jQuery. Je ne suis pas sûr à 100% de cette approche, alors je me demandais comment les autres ont géré ce scénario.

Cette méthode semble-t-elle saine? Y a-t-il un meilleur moyen d'y parvenir?

Répondre

1

Étendre la vue et remplacer la suppression pour qu'elle ne l'appelle plus. $ El.remove();

Exemple

var EnhanceView = Backbone.View.extend({ 
remove: function() { 
    this.stopListening(); 
    return this; 
} 
}); 

devrait être aussi simple que cela.

+0

Cette vue sera-t-elle nettoyée par le garbage collector puisqu'elle fait toujours référence à un élément jQuery? –

+0

Supprimer des références ne fera jamais mal. Mais je ne peux pas dire avec certitude comment le GC va gérer le sien (et n'a pas le temps de le découvrir). Je dirais utiliser la suppression sur. $ El et utiliser la méthode remove pour rester plus en ligne avec le flux Backbone d'origine. –

+0

Je pense que vous auriez aussi besoin de 'undelegateEvents', sinon il y aura toujours un jQuery' on' attaché au 'el' de la vue. –

Questions connexes