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

Posted

技术标签:

【中文标题】无法使用数据绑定设置过滤器值?【英文标题】:Not possible to set Filter value using data binding? 【发布时间】:2014-08-19 15:40:25 【问题描述】:

这个问题来自于对原始问题的钻取: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"
)

然后过滤器按预期工作。

问题

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

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

非常感谢任何帮助!

【问题讨论】:

我知道它已经很久了。你是如何解决这个问题的?我需要在我的应用程序中按日期为列表设置默认过滤器。我们必须在 JS 中使用带有模板的 bindAggregation 吗?还是有更好的方法? 我想我继续使用 EventBus,并在控制器中设置过滤器 不确定我是否在这里遗漏了什么,但你不能只做'value1:this.getView().getModel().getProperty("/someProperty")'(假设'this ´ 与控制器有关)? 通常情况下会这样,但在这种情况下,过滤器是聚合模板的一部分(请参阅上面提到的链接),因此每个过滤器都应该使用当前行的绑定上下文中的值进行设置 相关 GitHub 问题:github.com/SAP/openui5/issues/130 【参考方案1】:

我刚刚浏览了ClientListBinding的代码,不幸的是不支持Filter值的属性绑定。请查看源代码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;
;

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于无法使用数据绑定设置过滤器值?的主要内容,如果未能解决你的问题,请参考以下文章

无法将 DataGridViewComboBoxColumn 中的值设置为绑定的 DataGridView

无法使用 RxSwift 变量 asObservable() 设置绑定(到:UITableView)

具有完整 POJO 数据绑定的杰克逊自定义过滤器

vue el-select 设置默认值后选项无法切换

el-select设置默认值后选项无法切换

将其值设置为“”后无法过滤 AutoCompleteTextView