【问题标题】:Backbone Collection骨干集合
【发布时间】:2017-03-09 12:52:25
【问题描述】:

我有一个页面,我必须在其中显示 7 个集合的总数。 如果在集合中创建了任何新项目,那么我的页面应该显示更新的计数。我尝试如下

this.listenTo(XyzCollection, 'update', function() {
  self.lengthVariable = XyzCollection.length;
  self.render();
});

这种方法的问题是,如果任何集合的数量很大(比如 1000),那么渲染方法就会被调用很多次(总共有 7 个集合被调用)。

我也试过了

this.listenTo(XyzCollection, 'update', function() {
    self.lengthVariable = XyzCollection.length;
    //self.render();
});

即只需更新变量,但页面不会刷新,并且在模板上我看到计数为 0(我注释掉了渲染)。

请提出一个合适的方法来实现这个场景

view的初始化和渲染示例如下:

initialize: function() {
    xxx1Collection.refresh();
    xxx2Collection.refresh();
    xxx3Collection.refresh();
    xxx4Collection.refresh();
    xxx5Collection.refresh();
    xxx6Collection.refresh();
    xxx7Collection.refresh();

    var self = this;

    this.listenTo(xxx1Collection, 'update', function() {
        self.var1 = xxx1Collection.length;
        self.render();
    });

    this.listenTo(xxx2Collection, 'update', function() {
        self.var2 = xxx2Collection.length;
        self.render();
    });

    this.listenTo(xxx3Collection, 'update', function() {
        self.var3 = xxx3Collection.length;
        self.render();
    });

    this.listenTo(xxx4Collection, 'update', function() {
        self.var4 = xxx4Collection.length;
        self.render();
    });  

    this.listenTo(xxx5Collection, 'update', function() {
        self.var5 = xxx5Collection.length;
        self.render();
    });

    this.listenTo(xxx6Collection, 'update', function() {
        self.var6 = xxx6Collection.length;
        self.render();
    });

    this.listenTo(xxx7Collection, 'update', function() {
        self.var7 = xxx4Collection.length;
        self.render();
    });
},

render: function() {
    this.$el.html(this.template({
        count1: self.var1,
        count2: self.var2,
        count3: self.var3,
        count4: self.var4,
        count5: self.var5,
        count6: self.var6,
        count7: self.var7,
    }));

}

【问题讨论】:

  • 你在哪里添加这个监听器?看起来您要多次添加它,否则不应多次调用它。请提供minimal reproducible example
  • 我在initialize方法中添加监听器,对于每个集合(7),我添加监听器,分别为每个集合更新七个变量
  • initialize 是什么?路由器?一个看法?其他视图的基本视图?这些实例有多少? XyzCollection 是 Collection 构造函数还是实例? (案件可疑)我们需要更多信息来帮助您。如果您说嘿,我在初始化时执行此操作并且出现意外行为,我们无法解决问题。我们需要看看你在做什么来找出意外行为背后的实际原因......
  • 在视图的初始化中,我调用了集合...只有一个视图,应该调用 7 个集合,这样就可以将计数传递给模板。Xyz 是一个集合实例(我将它导入到视图中以使用它)。同样在视图的初始化中......我对 6 个不同的集合还有 6 次调用......我希望它现在清楚......
  • 也许至少发布处理这 7 个集合的整个初始化方法。言语不太可能帮助任何人解决问题

标签: javascript backbone.js


【解决方案1】:

假设视图中存在 7 个具有递增名称的集合有充分的理由,那么在集合更新时重新呈现的最简单方法如下。

initialize: function() {
    // make collections properties of the view
    this.xxx1Collection.refresh();
    this.xxx2Collection.refresh();
    /* ... */
    this.xxx7Collection.refresh();

    // create the event hash once, and reuse it.
    var events = { update: this.render };

    // there's no need to use `self` when using `this.listenTo`
    this.listenTo(this.xxx1Collection, events)
        .listenTo(this.xxx2Collection, events)
        /* ... */
        .listenTo(this.xxx7Collection, events);
},

render: function() {
    // just pass the length here instead.
    this.$el.html(this.template({
        count1: this.xxx1Collection.length,
        count2: this.xxx2Collection.length,
        /* ... */
        count7: this.xxx7Collection.length,
    }));
}

来自Catalog of Events

"update" (collection, options) — 在任何事件之后触发的单个事件 已从集合中添加或删除模型的数量。

【讨论】:

  • @TJ 问题来自其他地方,未在问题中显示。
  • 是的,那么问题的答案如何...... ;)
  • @TJ 它以最简单的方式在更新时重新渲染,确认它应该像那样工作。 OP 现在可以在别处寻找问题。
  • “你的代码应该可以工作,看看别处”应该是评论+近距离投票,而不是回答imo ...(“问题来自其他地方,未在问题中显示”是原因关闭投票)
  • @TJ “它以最简单的方式在更新时重新渲染”,它也是关于update事件的附加信息和基本的 JavaScript,对于评论来说太长了。评论用于要求澄清(您已经这样做了)。展示一个工作示例是回答问题的有效方式,或者至少有助于更接近 OP 正在寻找的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-13
  • 2012-07-31
相关资源
最近更新 更多