2013-08-05 2 views
2

Je rencontre des problèmes pour résoudre les fuites de mémoire de backbone, jusqu'à présent, j'ai tenté de nettoyer les vues en utilisant jquery CleanData lorsque les vues sont en train de se retirer du DOM.Backbone fuit encore la mémoire après plusieurs tentatives de nettoyage

Chaque fois qu'une vue est supprimée (même via jQuery .html()), elle frappe la méthode dispose() qui devrait théoriquement tuer toutes les références qui empêchent la collecte de la vue. Malheureusement, l'application vient de construire la mémoire

Code

ci-dessous,

Backbone.View.prototype.dispose = function(){ 
    // unbind all events, so we don't have references to child views 
    this.unbind(); 
    this.off(); 
    // if we have a collection - unbind all events bound to this context 
    this.collection && this.collection.off(null, null, this); 
    // do the same with a model 
    this.model  && this.model.off(null, null, this); 
    delete this; 
}; 

données propres:

$.cleanData = function(elems) { 
    $.each(elems, function(i, elem) { 
     if (elem) { 
      $(elem).trigger("dispose"); 
     } 
    }); 
    oldClean(elems); 
}; 

Le travail de code, d'en disposer est touché (j'ai ajouté l'événement dans la vue), mais il est jamais recueilli quand je change de page. (A propos de l'événement d'élimination ..) Je n'appelle pas explicitement remove sur toutes les vues. le conteneur de l'application est vidé, jQuery fait cleanData. J'ai ajouté un événement disposer & Je déclenche cette fonction dans cleandata

+0

Je suis confus à la façon dont vous semblent supprimer les liaisons .. '.trigger $ (élém) ("disposer"); 'est un sélecteur jQuery et vous êtes censé nettoyer la vue Backbone. Alors pourquoi ne pas simplement appeler 'this.dispose()' lorsque vous êtes dans la vue –

+0

car je n'appelle pas explicitement remove sur toutes les vues. le conteneur est vidé, jQuery fait cleanData et j'ai ajouté un événement dispose que appelle cette fonction –

+1

Avez-vous regardé Marionette qui étend les capacités de Backbone.js. Marionette semble faire un très bon travail pour garder Backbone propre et exempt de fuites de mémoire. – Kalpers

Répondre

3

Je pense que le problème est delete this ne fait pas ce que vous pensiez qu'il le ferait. Cela dépend de la façon dont vous initiez votre vue. Affectez-vous votre vue à n'importe quelle variable ou initiez-la dans une portée qui vit au-delà du point où vous changez de page?

En outre, il y a une fonction remove() sur Voir Backbone

Plus d'informations sur JavaScript deletehttp://perfectionkills.com/understanding-delete/ et https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete