所以我有一个项目清单。
每个项目都有喜欢或不喜欢的按钮。我希望按总分来排序,这是=#likes less#dislikes。
我想了解原因:
这就是我将它存储在馆藏中的items.js 列表(地面0表格)中的方式。
var item = _.extend(itemAttributes, {
lovers: [],
likes: 0,
haters: [],
dislikes: 0
//popularity: likes - dislikes I tried inserting in collection but doesnt work too
});
所以我通过车把手帮助+主列表控制器的扩展
对其进行排序这是车把片段
Template.registerHelper('popularity', function(likes, dislikes) {
var popularity = likes - dislikes;
return popularity;
这是router.js中的分拣机
BestItemController = ItemListController.extend({
sort: {popularity: -1},
nextPath: function() {
return Router.routes.BestItem.path({itemsLimit: this.itemsLimit() + this.increment})
}
});
因此,车把popularity
计算确实有效,加上{{ popularity 123numbersxx }}
时会显示受欢迎度分数
然而,排序不起作用,可能是因为排序没有在表面排序""计算,而是实际项目及其字段?
我尝试插入一个额外的架构字段(参见上面的注释行)。但是,这会导致未定义状态likes
的错误。
有人会帮我指点一下吗? 另外,如果你认为我的做事方法不好,还要欣赏其他方式吗?例如,如果在单个模板helper.js文件上而不是在主router.js文件上进行排序。
非常感谢!
答案 0 :(得分:1)
你可以实现客户端。我将继续这样做:
您可能会使用item
次迭代显示要排序的{{#each item}}
。我将使用自定义助手替换item
中的#each
,并使用游标或数组作为参数创建一个函数,该函数将使用当前排序设置对项目进行排序。
你的助手看起来像那样:
Template.items.helpers({
sortedItems: function(){
return sortMyItems(items.find()) //add .fetch() if you need an array,
//or directly your array if you already have it in a variable.
}
});
在文件的开头,添加sortMyItems
函数,返回已排序的项目列表。
sortMyItems = function(cursor) {
if(!cursor) {
return [];
}
var sortBy = Session.get("sortBy");// in your case, it would be set to "popularity"
var sortAscending = Session.get("sortAscending ");
if(typeof(sortAscending) == "undefined") sortAscending = true;
var sorted = [];
var raw = cursor.fetch();
// sort
if(sortBy) {
sorted= _.sortBy(raw, sortBy);
// descending?
if(!sortAscending) {
sorted= sorted.reverse();
}
}
return sorted;
}
这里我使用Session vars,但我建议您使用反应变量或反应词典,因为这是与当前视图相关的功能。