javascript - 无法使用数据绑定(bind)设置过滤器值?

标签 javascript sapui5

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

背景

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

问题

如果我使用过滤器,其中过滤器值 value1data binding 指定:

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"
})

然后过滤器按预期工作。

问题

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

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

非常感谢任何帮助!

最佳答案

我刚刚浏览了 ClientListBinding 的代码,不幸的是不支持 Filter 值的属性绑定(bind)。请查看源码here .

参见函数getFilterFunction,过滤器值是从你的Filter定义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;
};

我猜你必须在这里解决问题才能使用事件处理程序。

关于javascript - 无法使用数据绑定(bind)设置过滤器值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25387580/

相关文章:

javascript - 如何删除 jquery 中的 UI selectmenu?

sapui5 - 如何替换已弃用的 jQuery 函数?

sapui5 - OData 与 $expand 绑定(bind)

javascript - 引用具有未定义值的变量

javascript - 如何防止 Angular 数组更新闪烁

xml - 两个相邻的tileContainer

javascript - openui5/sapui5 : Change parts of a page controlled by router

javascript - 如何从 SAPUI5 片段中获取 Control byId

javascript - 仅完成多个 ajax 请求中的最后一个

javascript - 由于模块的 js 文件中的 "Import",ts-jest 无法运行 tsx 测试文件