Backbone - 在集合中添加一个条目(来自集合内部)

时间:2015-07-21 12:27:05

标签: javascript backbone.js marionette

我有一个CollectionView,可以生成这种列表

<ul>
    <li> All </li>
    <li> Option 2</li>
    <li> Option 2<li>
<ul>

有关此列表的第二个和第三个条目的所有信息都是从DB中获取的。 但是我想拥有&#34; All&#34;也有选择。我希望这个选项能够成为我收藏中的第一个位置。

我想到的只是覆盖MyCollection的add()方法。它工作得很好,但我只是检查是否有更好/更简单的方法。

MyCollection的:

define([ 'underscore',  'backbone', 'models/MyModel'], function(_, Backbone, MyModel){
  var MyCollection = Backbone.Collection.extend({
    model: MyModel,

    initialize: function(opts) {
        this.options = opts;
        this.add({name: "All", icon_class="all"}) /// this doesn't work
    },

    add: function(models, options) {
      models.unshift({name:"All", icon_class:"all"})
      return this.set(models, _.extend({merge: false}, this.options));
    },
  });

  return MyCollection;
});

(另一方面,集合本身不是从DB中获取数据。实际上,fetch被称为a(让我们称之为)ModelX,它分配数据到也使用相同数据的其他集合。 因此,一旦ModelX完成获取所有数据,它就会将数据传递给所有必需的视图。)

2 个答案:

答案 0 :(得分:2)

我在模板级别上解决了这些问题。因为这个元素并非真正存在于你的收藏中,所以我不会伪造它:

<ul>
  <li>All</li>
  <% _.each(item, function (i) { %>
  <li><%- i.name%></li>
  <% }); %>
</ul>

答案 1 :(得分:0)

我认为你有正确的想法。由于您有单独的模型来表示服务器上的持久数据,因此数据显示此集合显然是为了表示视图数据,因此将 All 放入集合中是可以的。

您可以从集合内部或外部&#34;控制器&#34;中执行此操作,具体取决于您的体系结构。你似乎想做前者。

但是你的add hack非常难看。覆盖构造函数会更清晰。 (请参阅here了解为何initialize无法正常工作。)

var MyCollection = Backbone.Collection.extend({
    model: MyModel,

    constructor: function(models, options) {
        if (!models) models = [];

        models.unshift({name:"All", icon_class:"all"});
        Backbone.Collection.prototype.constructor.call(this, models, options);
    },
}