与Backbone.js和Marionette.js的分页

时间:2013-11-18 15:22:22

标签: javascript backbone.js marionette

我正在使用Backbone.js,我想用Marionette.js扩展它。有一件事,在Backbone中有效,但我无法用Marionette的观点来实现,这是我处理分页的方式。 在Backbone中,我在Backbone.Collection中有一个名为pagination的方法,如下所示:

var ordersCollection = Backbone.Collection.extend({
        url: 'collection',
        model: Order,
        pagination: function(page) {
            perPage = 10;
            var collection = this;
            collection = _(collection.rest(perPage * page));
            collection = _(collection.first(perPage));
            return collection;
        }
    });

然后我可以像这样创建分页集合:

ordersCollection = new OrdersCollection();
ordersCollection.fetch();
ordersFirstPage = ordersCollection.pagination(1);

但是当我尝试将此集合传递给Marionette.CompositeView时,我收到此错误

  

未捕获TypeError:对象[object Object]没有方法'on'

我知道这是因为我的分页功能没有以确切的Backbone.Collection格式返回集合。所以我尝试使用以下方法修复它:

ordersFirstPage = new Backbone.Collection(ordersFirstPage)

TypeError消失了,但是CompositeView传递给其模板的值表现为空。

任何想法,如何修改集合对象或分页函数以使其工作?

2 个答案:

答案 0 :(得分:0)

你不应该构建一个Backbone.Collection而是一个'ordersCollection'。 E.g:

ordersFistPage = new OrdersCollection(ordersCollection.pagination(1));

您应该检查您要访问的值是否在CompositeView中(集合应该包含数据,您可以设置集合的属性)还是CompositeView的ItemView(集合中的模型应该具有数据)。

答案 1 :(得分:0)

最后我通过在分页功能中使用_.flatten()来管理它。所以我在收集中使用的_.first()方法的结果上使用了flatten。

我的分页收藏现在看起来像这样:

var ordersCollection = Backbone.Collection.extend({
        url: 'collection',
        model: Order,
        pagination: function(page) {
            perPage = 10;
            var collection = this;
            collection = _(collection.rest(perPage * page));
            collection = _(collection.first(perPage));
            collection = _(collection).flatten(true);
            return collection;
        }
    });

它似乎是Backbone / Marionette系列分页最简单,最优雅的解决方案。