骨干.Paginator in 'infinite'mode抛出'最大调用栈大小超过'm

Backbone.Paginator in 'infinite' mode throws 'Maximum call stack size exceeded' on model.destroy

本文关键字:调用 抛出 in Paginator infinite mode 骨干      更新时间:2023-09-26

我完全卡住了这个,不能确切地弄清楚为什么会发生这种情况。我用的是Backbone。在一个木偶应用程序中的分页器。此外,对于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();
  });

然后我得到a: 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"
    }
  });

使用木偶行为提醒用户在删除项目之前进行确认。

我想明白了-这里的关键,至少对我来说,是在delete方法中,它最初是:

          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你只是触发"itemview:sim:delete"或有任何其他事情发生,我的第一个猜测是,有些东西是监听和触发相同的事件。