【问题标题】:Marionette.Backbone.js collection onRequest called for all instances为所有实例调用 Marionette.Backbone.js 集合 onRequest
【发布时间】:2013-10-28 08:38:00
【问题描述】:

我正在编写一个包含三个类似子布局的 Marionette 布局。它们中的每一个都是同一个类的一个实例。代码如下:

Marionette.Layout.extend({
        subCollection1: new SubCollection(),
        subCollection2: new SubCollection(),
        subCollection3: new SubCollection(),

        initialize: function () {
            this.subView1 = new subView ({
                collection: this.subCollection1)
            });
            this.subView2 = new subView ({
                collection: this.subCollection2)
            });
            this.subView1 = new subView ({
                collection: this.subCollection3)
            });
        },

        onRender: function() {
            this.Reg1.show(this.subView1);
            this.Reg2.show(this.subView2);
            this.Reg3.show(this.subView3);
        },

        fetchColletions: function () {
            this.subCollection1.fetch({ data: { /* some data for webserver */ } });
            this.subCollection2.fetch({ data: { /* some data for webserver */ } });
            this.subCollection3.fetch({ data: { /* some data for webserver */ } });
        }
});

然后在我的子布局中,我将函数绑定到初始化函数中的集合请求,如下所示:

Marionette.Layout.extend({
        onCollectionRequest: function () {
            console.log('summary.onCollectionRequest ' + this.cid);
            //debugger;
        },

        initialize: function () {
            this.listenTo(this.collection, 'request', this.onCollectionRequest);

        }
    });

问题是,对这些集合中的任何一个调用 fetch 都会触发所有三个集合中的请求事件,所以我得到这样的日志:

获取集合
GET /* 服务器地址 */ 200 OK 157ms
onCollectionRequest view15
onCollectionRequest view24
onCollectionRequest view33
GET /* 服务器地址 */ 200 OK 332ms
onCollectionRequest view15
onCollectionRequest view24
onCollectionRequest view33
/* 第三个以此类推 */

我错过了什么吗?我一直认为事件绑定是每个实例而不是每个类。我应该如何解决这个问题?

附:我的代码另外包含在 require.js define() 中,但我认为这与我的问题无关,所以我在代码片段中省略了它。

【问题讨论】:

  • 您的 fetchCollections 方法会触发三个集合的提取。我不明白为什么如果所有事件都被触发,你会感到惊讶
  • 看我帖子末尾的日志。我很惊讶,因为它们中的每一个都被触发了三次。每次取回一次。如果我删除了 subcollection2.fetch 和 subcollection3.fetch 它仍然会调用所有三个事件。
  • 您是否创建了第一个布局的多个实例?
  • 不是这样的,看我的回答。 Thx 4 帮助虽然 ;)

标签: javascript backbone.js marionette backbone-events


【解决方案1】:

好吧,我已经解决了我的问题。事实证明,我在我的 App 初始化程序中做了一件非常糟糕的事情。为了获得全局获取错误处理程序,我在原型上使用了“on”函数:

Backbone.Collection.prototype.on('error', fetchErrorHandler);

正如How to add a default error handler to all Backbone models? 中所述,这是一个坏主意,因为它为应用程序中的所有集合实例创建全局事件处理程序。它导致每个事件处理程序对于所有集合都是通用的,这正是我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-02
    • 1970-01-01
    • 2014-01-17
    • 2022-11-29
    相关资源
    最近更新 更多