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

Why am I unable to sort list by difference of 2 fields?

本文关键字:排序 列表 字段 2个 为什么      更新时间:2023-09-26

我有一个项目列表。

每个项目有一个喜欢或不喜欢的按钮。我希望按总分排序,即= #喜欢的少#不喜欢的。

我想知道为什么:

  1. 下面的车把+排序是不工作在客户端,如何使其工作?
  2. 如果服务器端解决方案会更好,为什么?(服务器端占用不必要的磁盘空间,从我在其他帖子和过早优化中学到的-是的,我还在早期阶段)

这就是我如何将它存储在items.js中collections (ground 0形式)中的列表中。

var item = _.extend(itemAttributes, {
  lovers:       [], 
  likes:        0,
  haters:       [], 
  dislikes:     0
  //popularity:      likes - dislikes I tried inserting in collection but doesnt work too 
});

所以我通过handlebar helper +主列表控制器的扩展来排序

这是车把段

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文件上排序,而不是在主路由器.js文件上排序。

多谢!

可以在客户端实现。下面是我要做的:

您可能会使用{{#each item}}迭代显示要排序的item。我会用自定义助手替换#each中的item,并创建一个函数,使用游标或数组作为参数,该函数将使用当前排序设置对您的项目进行排序。

你的助手可以像这样:

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;
}

这里我使用会话变量,但我建议你使用响应变量或响应字典,因为这是一个只与当前视图相关的特性。