我正在使用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传递给其模板的值表现为空。
任何想法,如何修改集合对象或分页函数以使其工作?
答案 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系列分页最简单,最优雅的解决方案。