我在每个反应集合中实现非洗牌都有问题。 有了这个,我的意思是我有一个按分数值排序的集合,即使分数发生变化,我也不想改变顺序。 我希望它是被动的,但每次都没有列表项改变位置。
目前的代码是这个
ListController = FastRender.RouteController.extend({
find: function (tag){
if(!!tag){
return Lib.Items.Tags.SupportedType[tag].find;
}
return {};
},
findOptions: function(order, pageNum) {
var findOption = { limit: Lib.Items.Settings.ItemsPerPage * (parseInt(pageNum) || this.increment)};
if(!!order){
_.extend(findOption, Lib.Items.ListOrders.SupportedType[order].findOption);
}
return findOption;
},
waitOn: function() {
return [
Meteor.subscribe('items.all', this.params.tag, this.params.order, this.pageNum),
];
},
data: function () {
return {
"items": Items.find(this.find(), this.findOptions(this.params.order, this.params.pageNum))
};
},
action: function(){
this.render();
}
});
[...]
this.route('list', {
path: '/list/:pageNum?',
controller: ListController
});
this.route('list_order_limit', {
path: '/list/order/:order/:pageNum?',
controller: ListController
});
this.route('list_tag_limit', {
path: '/list/tag/:tag/:pageNum?',
controller: ListController
});
this.route('list_tag_order_limit', {
path: '/list/tag/:tag/order/:order/:pageNum?',
controller: ListController
});
和
{{#each items}}
{{> item}}
{{/each}}
有了这一切,但列表更改顺序(这是正确的,但不是我想要的行为)。 我尝试了一些不同的解决方案,但没有任 我开始修改数据。 我把
data: function () {
return {
"items": Items.find(this.find(), this.findOptions(this.params.pageNum))
};
},
通过这种方式,数据对排序一无所知(只有订阅知道用于获取第一个项目数项目的订单)。 问题在于,即使路由从一个订单改变到另一个订单,该列表也不会更新。虽然发生了这种情况,但我看到使用新的订单参数调用订阅(因此通过ddp发送的数据实际上应该是正确的)。 我甚至试图停止并重新订阅但没有改变。 我做错了什么?是否有更好的方法让列表在其项目中有反应但不按顺序排列? 提前谢谢。
答案 0 :(得分:0)
我的代码中没有看到任何通过分数值明确引用订单的内容;但我相信这是Meteor中尚未解决的问题:https://github.com/meteor/meteor/issues/1276。
该线程中建议的一个解决方法是在客户端上添加_id
的显式排序,这将确保即使项目发生更改,游标也是稳定的。
我可以想象一种更为非常规的解决方法,即在发布函数中计算所需的顺序,并使用publish API将自定义字段发送到客户端,然后按这些字段进行排序。这比光标更复杂,但会导致项目以发布时确定的确切顺序显示。