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

IT技术 javascript sapui5
2021-03-08 12:20:54

这个问题来自深入研究原始问题: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}"
})

那么下拉列表不会呈现任何项目

但是,如果我对 property 的值进行硬编码value1

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

然后过滤器按预期工作。

问题

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

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

任何帮助是极大的赞赏!

2个回答

刚刚翻了一下ClientListBinding的代码,可惜不支持Filter值的属性绑定。请在此处查看源代码

请参阅函数getFilterFunction,过滤器值是从您的过滤器定义oValue1oValue2 中获取的,它不会解析任何 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;
};

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

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