【问题标题】:dgrid custom sort with secondary sort column具有辅助排序列的 dgrid 自定义排序
【发布时间】:2016-08-23 19:28:33
【问题描述】:

我目前在 dgrid 上使用自定义排序功能(粘贴在下面)。它不会彻底改变排序,只是对一个特定列进行唯一排序,并对其他列进行排序,不区分大小写。我想通过名为“scheduled”的列添加辅助排序,以便在对任何其他列进行排序时添加到排序中。我只是不知道该怎么做。我已经看到了如何覆盖排序以按两列排序,但不是在使用自定义排序时。二级排序将始终存在,无论单击哪个其他列。

作为参考,我正在运行 dojo 1.10 和 dgrid 1.0。数据来自 RequestMemory DStore,我真的希望这种情况发生在网格上,而不是回到存储级别。任何帮助将不胜感激。

currGrid.on('dgrid-sort', function (event) {
  event.preventDefault();
  var sort = event.sort[0];
  currGrid.set('sort', function (a, b) {
     if (sort.property == "thisField") {
       //special sort for thisField
       if (a[sort.property] !== 'undefined' && typeof a[sort.property] == "string") {
          var colorA =  a[sort.property].split("|");
          var aValue = colorA[0].toLowerCase();
       }
       if (b[sort.property] !== 'undefined' && typeof b[sort.property] == "string") {
          var colorB =  b[sort.property].split("|");
          var  bValue = colorB[0].toLowerCase();
       }
       if (String(aValue) == String(bValue)) {
          var result = 0;
       } else if (dojo.string.trim(aValue) == "") {
          var result = true ? 1 : -1;
       } else if (dojo.string.trim(bValue) == "") {
         var result = true ? -1 : 1;
       } else {
         var result = aValue > bValue ? 1 : -1;
       }
       return result * (sort.descending ? -1 : 1);
     } else {
       //Sort for all other fields same as always (except toLowerCase)
       if (a[sort.property] !== 'undefined' && typeof a[sort.property] == "string") {
          var aValue = a[sort.property].toLowerCase();
       } else {
          var aValue = "";
       }
       if (b[sort.property] !== 'undefined' && typeof b[sort.property] == "string") {
          var bValue = b[sort.property].toLowerCase();
       } else {
          var bValue = "";
       }
       var result = aValue > bValue ? 1 : -1;
       return result * (sort.descending ? -1 : 1);
     }
  });
  currGrid.updateSortArrow(event.sort, true);
});
currGrid.startup();

【问题讨论】:

    标签: dojo dgrid dstore


    【解决方案1】:

    您可以执行以下操作。

    currGrid.on('dgrid-sort', function (event) {
        event.preventDefault();
        var sortSet = [];
        sortSet.push(event.sort[0]);
        sortSet.push({property: "scheduled"});
        currGrid.set('sort', function (a, b) {
            var aValue, bValue, result = 0;
            for(var i = 0; i < sortSet.length; i++){
                var sort = sortSet[i];
                if (sort.property == "thisField") {
                    //special sort for thisField
                    if (a[sort.property] !== 'undefined' && typeof a[sort.property] == "string") {
                        var colorA =  a[sort.property].split("|");
                        aValue = colorA[0].toLowerCase();
                    }
                    if (b[sort.property] !== 'undefined' && typeof b[sort.property] == "string") {
                        var colorB =  b[sort.property].split("|");
                        bValue = colorB[0].toLowerCase();
                    }
                    if (String(aValue) == String(bValue)) {
                        result = 0;
                    } else if (dojo.string.trim(aValue) == "") {
                        result = true ? 1 : -1;
                    } else if (dojo.string.trim(bValue) == "") {
                        result = true ? -1 : 1;
                    } else {
                        result = aValue > bValue ? 1 : -1;
                    }
                    return result * (sort.descending ? -1 : 1);
                } else {
                    //Sort for all other fields same as always (except toLowerCase)
                    if (a[sort.property] !== 'undefined' && typeof a[sort.property] == "string") {
                        aValue = a[sort.property].toLowerCase();
                    } else {
                        aValue = "";
                    }
                    if (b[sort.property] !== 'undefined' && typeof b[sort.property] == "string") {
                        bValue = b[sort.property].toLowerCase();
                    } else {
                        bValue = "";
                    }
                    //You need this check here 
                    if(aValue != bValue){
                        result = aValue > bValue ? 1 : -1;
                        return result * (sort.descending ? -1 : 1);
                    }
                }
            }
            return 0;
        });
        currGrid.updateSortArrow(event.sort, true);
    });
    currGrid.startup();  
    

    我对您的代码有些担心,变量result, aValue and bValue 在 if 语句中都是本地的,但它们在语句之外使用。如果在全局空间中以相同的名称定义了一些其他变量,可能会导致错误的结果。所以我修改了它们。

    所以第二部分你需要检查aValue == bValue是否返回0。

    【讨论】:

    • @T Kambi 抱歉延迟回复您,我刚刚对此进行了测试,它在第一次单击对任何列进行排序时效果很好。但是,当另一列以相反方向排序时,它会反转计划列的排序。我希望计划(辅助排序列)始终升序。我尝试将 `sortSet.push({property: "scheduled"});` 更改为 sortSet.push({property: "scheduled", descending:false});但这并没有做到。我在最初的问题中可能并不清楚这一点,但如果你能帮我解决这个问题,我将不胜感激。
    • 调度排序总是升序,因为我们没有为该选项设置降序属性。但是,它将比其他排序选项具有第二优先级。如果您希望“计划”成为您的首要任务,请先添加计划排序,然后在 sortSet 中添加另一个排序。
    • 是的,你完全正确。我单击的列中隐藏了数据,导致排序与我计划的不同。一切都像现在这样。谢谢@T Kambi
    猜你喜欢
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    相关资源
    最近更新 更多