Backbone.Paginator в "бесконечном" режиме выдает "Превышен максимальный размер стека вызовов" на model.destroy

Я полностью застрял на этом и не могу понять точно, почему это происходит. Я использую Backbone.Paginator в приложении Marionette. Кроме того, для API я использую Tastypie, что не должно иметь значения, но я хочу быть максимально подробным в своем объяснении.

Сначала я определил коллекцию страниц:

 Entities.SimCollection = Backbone.PageableCollection.extend({
   url: "api/sims/response/",

   mode: "infinite",

   state: {
     pageSize: null,
     sortKey: "updated",
     order: 1
   },

   queryParams: {
     totalPages: null,
     totalRecords: null,
     currentPage: null,
     sortKey: "sort",
     order: "direction",
     directions: {
       "1": "asc",
       "-1": "desc"
     }
   },

   parseRecords: function(resp) {
     return resp.objects;
   },

   parseLinks: function (resp, xhr) {
     return resp.meta;
   },

   model: Entities.Sim

 });

И когда я иду, чтобы уничтожить модель через мой взгляд, используя этот код:

  simsListView.on("itemview:sim:delete", function(childView, args){
    args.model.destroy();
  });

Я тогда получаю: Uncaught RangeError: Maximum call stack size exceededи если консоль в chrome открыта, браузер просто полностью вылетает.

Единственное, что мне удалось выяснить, чтобы заставить его перестать выдавать ошибку, было сделать что-то, что включало переключение режима с "бесконечного" на "серверный", но это просто кажется совершенно неправильным, и оно также теряет свое состояние и возвращается назад. на первую страницу, если я удалю модель на любой другой странице:

          simsListView.on("itemview:sim:delete", function(childView, a
rgs){
            sims.switchMode("server");
            args.model.destroy();
          });

Конечно, любая помощь очень ценится.

Дополнительная информация:

В моем макете (ItemView) я делаю что-то вроде этого:

  Sim.SimView = Marionette.Layout.extend({
    initialize: function(options) {
      this.userModel = options.userModel;
    },
    triggers: {
      "click td a.js-edit": "sim:edit",
      "click button.js-view": "sim:view"
    },
    tagName: "tr",
    template: "#sims-item",
    behaviors: {
      Confirmable: {
        event: "sim:delete",
        message: "Are you sure you want to delete this SIM?"
      }
    },
    regions: {
      editRegion: "#edit-region",
      deleteRegion: "#delete-region"
    }
  });

Который использует Marionette Behavior, чтобы предупредить пользователя о подтверждении перед удалением элемента.

2 ответа

Решение

Итак, я понял это - ключ здесь, по крайней мере для меня, был в методе удаления, который был изначально:

          simsListView.on("itemview:sim:delete", function(childView, args){
            sims.switchMode("server");
            args.model.destroy();
          });

Вызвали "Превышение максимального стека вызовов" - решение состоит в том, чтобы изменить его так, чтобы сначала он не переключался в режим "сервер", а оставался в "бесконечном" режиме, а также мне нужно было удалить модель из полной коллекции и затем уничтожьте его - кажется, это решение:

          simsListView.on("itemview:sim:delete", function(childView, args) {
            sims.fullCollection.remove(args.model);
            args.model.destroy();
          });

Если кто-то придумает конкретную причину для этого, мне было бы интересно услышать это, но в противном случае проблема решена!

В вашем элементе зрения вы просто запускаете "itemview:sim:delete" или что-то еще происходит, мое первое предположение будет, что что-то ожидает и вызывает то же событие. в этом случае уничтожить на модели.

Другие вопросы по тегам