Speicherverlust beim Löschen von Elementen aus dem DOM über das Backbone

Ich habe Probleme mit DOM-Elementen, die nach dem Löschen im Speicher verbleiben. Ich habe ein unten gezeigtes Beispiel eingerichtet. Hinweis Ich verwende das Backbone-Layout-Manager-Plug-In, um meine Ansichten (sowie jQuery) zu verwalten.

Ich habe in Chrome vor und nach dem Löschen eines der Elemente in der Liste einen Heap-Snapshot erstellt und die beiden verglichen:

Wie Sie sehen, befindet sich das LI-Element noch im Speicher.

Backbone Layout Manager ruft view.unbind () und view.stopListening () auf, wenn eine Ansicht entfernt wird.

Unten ist der Beispielcode.

ListOfViewsToDelete.js

var TestModel = Backbone.Model.extend({
  });

  var TestCollection = Backbone.Collection.extend({
    model: TestModel,
  });

  var ViewToDelete = Backbone.View.extend({
    template: "ViewToDelete",
    tagName: "li",
    events: {
      "click .delete-button": "deleteItem"
    },
    deleteItem: function() {
      this.$el.trigger('remove-item', [this.model.id]);
    }
  });

  var ListOfViewsToDelete = Backbone.View.extend({
    template: "ListOfViewsToDelete",
    initialize: function() {
      this.collection = new TestCollection();

      for (var i = 0; i < 5; i++) {
        this.collection.add(new TestModel({id: i}));
      }

      this.listenTo(this.collection, 'all', this.render);
    },
    events: {
      "remove-item": "removeItemFromCollection"
    },
    beforeRender: function() {

      this.collection.each(function(testModel) {
        this.insertView("ul", new ViewToDelete({
          model: testModel
        }));
      }, this);

    },
    removeItemFromCollection: function(event, model) {
      this.collection.remove(model);
    }
  });

router.js

app.useLayout("MainLayout").setViews({
                    "#main": new ListOfViewsToDelete()
                }).render();

ListOfViewsToDelete.html

<ul>
</ul>

ViewToDelete.html

View to delete
<button class="delete-button">x</button>

Antworten auf die Frage(1)

Ihre Antwort auf die Frage