为什么我无法按2个字段的差异对列表进行排序?

时间:2015-07-20 08:38:26

标签: javascript mongodb sorting meteor helper

所以我有一个项目清单。

每个项目都有喜欢或不喜欢的按钮。我希望按总分来排序,这是=#likes less#dislikes。

我想了解原因:

  1. 以下车把+排序在客户端不起作用以及如何使其正常工作?
  2. 如果服务器端解决方案会更好,为什么? (服务器端占用了我在其他帖子中学到的不必要的磁盘空间和过早的优化 - 是的,我还处于早期阶段)
  3. 这就是我将它存储在馆藏中的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文件上进行排序。

    非常感谢!

1 个答案:

答案 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,但我建议您使用反应变量或反应词典,因为这是与当前视图相关的功能。