如何更改SAPUI5中自定义排序比较功能的降序?

时间:2017-07-20 06:32:53

标签: sapui5

我想对Time": "14:00:00"这样的本地时间进行排序,我从后端获得UTC时间,所以首先,我需要将它转换为格式化程序中的本地时间。

fnCompare中的

sap.ui.model.Sorter工作正常,但只有Ascending顺序,当我尝试将其更改为Descending时,它会无声地失败。有什么线索吗?

Demo in JSFiddle

Worklist.controller.js:

handleScheduleSortConfirm : function(oEvent) {
    var oTable = this.getView().byId("table"),
    oBinding = oTable.getBinding("items"),
    mParams = oEvent.getParameters(),
    sPath = mParams.sortItem.getKey(),
    convertToLocal = this.formatter.convertToLocal.bind(this),                            
    bDescending = mParams.sortDescending;

    if(sPath === "Time") {     
        var oSorter = new Sorter(sPath, bDescending); //bDescending not working here
        if(bDescending) {
            oSorter.fnCompare = function(a, b) {
                console.log("true"); // log works fine
                //even tried this, still not working
                oBinding.refresh(); 
                return convertToLocal(a) >  convertToLocal(b);
            };
        } else {
            oSorter.fnCompare = function(a, b) {
                console.log("false"); // log works fine
                return convertToLocal(a) <  convertToLocal(b);
            };  
        }

        oBinding.sort(oSorter);
        return;
    }
}

Worklist.view.xml:

//sap.m.Table
<Table id="table" items="{path: '/'}">
    <columns>
        <Column width="5%"></Column>
    </columns>

    <items>
        <ColumnListItem>
            <cells>
                <Text text="{
                    path: 'Time', 
                    formatter: '.formatter.convertToLocal'}
                "/>
            </cells>
        </ColumnListItem>
    </items>
</Table>

还有一个Sort Dialog片段

formatter.js:

convertToUTC : function(time) {
    if(time){
        const date = new Date("1970/1/1 " + time),
        offsetHour = ((new Date()).getTimezoneOffset()) / 60;

        date.setHours(date.getHours() + offsetHour);
        return this.formatter._formatTime(date); 
    }   
},

_formatTime : function(date) {
    const slice = this._sliceTime;
    return slice(date.getHours()) + ":" + slice(date.getMinutes()) + ":" + slice(date.getSeconds());
},

2 个答案:

答案 0 :(得分:1)

您的样本有两个问题:

  1. 您更改了两次排序顺序:首先,您为您创建的排序器提供bDescending标志,然后为fnCompare函数选择不同的实现。单独的每个更改都会反转排序顺序,但它们会相互抵消
  2. 你的compare函数返回一个布尔值,但是一个比较函数必须为-1a < b 0和{{1}返回a === b(或任何负数值) +1的(或任何正数值)(请参阅https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/sort,UI5分拣机使用相同的合同)
  3. a > b方法重写为

    handleSort

    然后两个按钮按预期对表格进行排序。

答案 1 :(得分:0)

我认为你不需要这个操作的自定义分拣机。您只需在控制器中定义“sap / ui / table / SortOrder”并使用如下:

{{1}}

选中此page