【问题标题】:Backbone : Make collection from slice of another collectionBackbone:从另一个集合的切片中创建集合
【发布时间】:2014-08-31 02:50:09
【问题描述】:

我想要一个集合的分页视图。我尝试使用 Backbone.Paginator,但无法正常工作。

我想我会自己做分页,我认为拥有我的全部收藏是个好主意,然后将大收藏的一小部分发送给视图,每次有人点击“下一步”时都这样做'。

我试过这样做,但它不起作用:

var purchaseCollection = new purchaseItemCollection({url:endpoints.purchases});

purchaseCollection.fetch();

var purchaseRangeCollection = new Backbone.Collection(purchaseCollection.models),
    purchaseView = new purchaseItemCollectionView({collection:purchaseRangeCollection});

我的第二个系列只有一个模型,但应该有几个。

我想知道这是否是最好的方法。

任何关于如何将集合拆分为集合或如何以另一种方式进行操作的建议将不胜感激!

【问题讨论】:

    标签: javascript backbone.js pagination


    【解决方案1】:

    您可以使用自定义对象来控制表示当前选定模型列表的集合。

    例如,

    var Slicer = function(opts) {
        opts || (opts = {});
    
        // your big collection
        this.collection = opts.collection || new Backbone.Collection();
    
        // a collection filled with the currently selected models
        this.sliced = new Backbone.Collection();
    };
    
    _.extend(Slicer.prototype, Backbone.Events, {
        // a method to slice the original collection and fill the container
        slice: function(begin, end) {
            var models = this.collection.models.slice(begin, end);
            this.sliced.reset(models);
    
            // triggers a custom event for convenience
            this.trigger('sliced', this.sliced);
        }
    });
    

    然后,您将创建此控制器的一个实例,并侦听此对象上的自定义事件 slicedsliced 集合上的 reset 事件以更新您的视图:

    var controller = new Slicer({
        collection: purchaseCollection
    });
    controller.on('sliced', function(c) {
        console.log('sliced', c.pluck('id'));
    });
    controller.sliced.on('reset', function(c) {
        console.log('reset', c.pluck('id'));
    });
    

    还有一个与http://jsfiddle.net/nikoshr/zjgkF/一起玩的演示

    请注意,您还必须考虑 fetch 的异步特性,您不能立即处理模型。在此设置中,您将执行类似

    的操作
    var purchaseCollection = new purchaseItemCollection(
        [], // you have to pass an array
        {url:endpoints.purchases} // and then your options
    );
    purchaseCollection.fetch().then(function() {
        // do what you want
        // for example
        controller.slice(0, 10);
    });
    

    【讨论】:

      【解决方案2】:

      您可以将完整收藏的model 定义为另一个独立的收藏。 然后在fetch() 之后,您将获得您的收藏作为您完整收藏的model

      var PurchaseCollection = Backbone.Collection.extend({
          model: Backbone.Collection
      })
      
      var purchaseCollection = new PurchaseCollection({url:endpoints.purchases});
      purchaseCollection.fetch()
      
      purchaseCollection.each(function (purchaseItem, index) {
          //the purchaseItem is what you want...
          //do anything...
      });
      

      如果你想要demo, click here

      【讨论】:

        【解决方案3】:

        请记住,集合构造函数有两个属性 (http://backbonejs.org/#Collection-constructor)。第一个是模型,第二个是 url 等选项。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-02-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多