【问题标题】:Pagination with Backbone.js and Marionette.js使用 Backbone.js 和 Marionette.js 进行分页
【发布时间】:2013-11-18 15:22:21
【问题描述】:

我正在使用 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 时,我收到此错误

Uncaught TypeError: Object [object Object] has no method 'on'

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

ordersFirstPage = new Backbone.Collection(ordersFirstPage)

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

任何想法,如何修改集合对象或分页功能以使其正常工作?

【问题讨论】:

    标签: javascript backbone.js marionette


    【解决方案1】:

    您不应该构建 Backbone.Collection,而是构建“ordersCollection”。例如:

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

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

    【讨论】:

    • 我仍然无法在模板中处理集合的模型。
    • 不是有效的模型数组,而是在集合对象内的属性值中的_wrapped值下添加模型数组。
    • 为什么需要 _() ?
    • 我用_()调用underscore.js。
    • 但您将返回一个下划线包装的模型数组。尝试 collection = collection.first(perPage);
    【解决方案2】:

    最后我通过在分页函数中使用 _.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 系列进行分页的最简单和优雅的解决方案。

    【讨论】:

    • 您的偏移量不正确,例如page = 5, collection.length = 49, perPage * page (10 * 5) 是 50, collection.rest(50) 没有给出任何结果,但带有 @987654326 @一切都被正确分割,在你的第 5 页上将有 9 条记录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 2016-02-09
    • 2014-12-26
    • 2017-08-04
    相关资源
    最近更新 更多