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

Qua*_*ure 9 javascript sapui5

这个问题来自于深入研究原始问题:如何根据表行数据在表下拉列表中设置过滤器

背景

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

问题

如果我使用过滤器,其中过滤器值value1数据绑定指定:

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

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

但是,如果我在属性上硬编码value1:

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

然后过滤器按预期工作.

问题

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

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

任何帮助是极大的赞赏!

Hao*_*jie 9

我刚刚浏览了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;
};
Run Code Online (Sandbox Code Playgroud)

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