无法使用数据绑定设置过滤器值?

时间:2014-08-19 15:40:25

标签: javascript sapui5

这个问题来自深入研究原始问题:How to set filter in table dropdown based on table row data

背景

我想在SAPUI5下拉控件上使用过滤器,我根据模型属性设置过滤器值(数据绑定)

问题

如果我使用过滤器值数据绑定指定过滤器值value1

new sap.ui.model.Filter({
    path     : "division", 
    operator : sap.ui.model.FilterOperator.EQ, 
    value1   : "{/someProperty}"
})

然后下拉列表不会呈现任何项目

但是,如果我硬编码属性value1的值:

new sap.ui.model.Filter({
    path     : "division", 
    operator : sap.ui.model.FilterOperator.EQ, 
    value1   : "Test"
})

然后过滤器按预期工作。

问题

我们不能使用数据绑定来指定过滤器值吗?或者我应该以另一种方式实现它?

我的一小部分实际上可以理解,使用来自同一模型的值在控件的模型上设置过滤器可能会引起一些参考问题,但是当使用两个不同的命名模型(一个用于下拉列表,以及一个过滤器值)

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:9)

我刚刚浏览了ClientListBinding的代码,遗憾的是不支持Filter值的属性绑定。请检查源代码here

请参阅函数 getFilterFunction ,过滤器值来自您的过滤器定义 oValue1 oValue2 ,它不会解析任何DataBinding路径来获取来自DataModel的值。

/**
 * Provides a JS filter function for the given filter
 * @name sap.ui.model.ClientListBinding#getFilterFunction
 * @function
 */
ClientListBinding.prototype.getFilterFunction = function(oFilter){
    if (oFilter.fnTest) {
        return oFilter.fnTest;
    }
    var oValue1 = this.normalizeFilterValue(oFilter.oValue1),
        oValue2 = this.normalizeFilterValue(oFilter.oValue2);

    switch (oFilter.sOperator) {
        case "EQ":
            oFilter.fnTest = function(value) { return value == oValue1; }; break;
        case "NE":
            oFilter.fnTest = function(value) { return value != oValue1; }; break;
        case "LT":
            oFilter.fnTest = function(value) { return value < oValue1; }; break;
        case "LE":
            oFilter.fnTest = function(value) { return value <= oValue1; }; break;
        case "GT":
            oFilter.fnTest = function(value) { return value > oValue1; }; break;
        case "GE":
            oFilter.fnTest = function(value) { return value >= oValue1; }; break;
        case "BT":
            oFilter.fnTest = function(value) { return (value >= oValue1) && (value <= oValue2); }; break;
        case "Contains":
            oFilter.fnTest = function(value) {
                if (typeof value != "string") {
                    throw new Error("Only \"String\" values are supported for the FilterOperator: \"Contains\".");
                }
                return value.indexOf(oValue1) != -1; 
            }; 
            break;
        case "StartsWith":
            oFilter.fnTest = function(value) { 
                if (typeof value != "string") {
                    throw new Error("Only \"String\" values are supported for the FilterOperator: \"StartsWith\".");
                }
                return value.indexOf(oValue1) == 0; 
            }; 
            break;
        case "EndsWith":
            oFilter.fnTest = function(value) { 
                if (typeof value != "string") {
                    throw new Error("Only \"String\" values are supported for the FilterOperator: \"EndsWith\".");
                }
                var iPos = value.lastIndexOf(oValue1);
                if (iPos == -1){
                    return false;                   
                }
                return iPos == value.length - new String(oFilter.oValue1).length; 
            }; 
            break;
        default:
            oFilter.fnTest = function(value) { return true; };
    }
    return oFilter.fnTest;
};

我想你必须在这里解决方法使用事件处理程序。

答案 1 :(得分:0)

不,目前无法使用数据绑定设置过滤器值。但是,OpenUI5存储库中标记为“贡献欢迎”的已批准增强issue。这意味着计划添加此功能,一旦添加,就可以使用数据绑定设置Filter值。