【问题标题】:How to concatenate two sap.ui.model.Filter in JSON model?如何在 JSON 模型中连接两个 sap.ui.model.Filter?
【发布时间】:2017-04-18 08:24:40
【问题描述】:

我有一个这样的 JSON 模型:

{
    "VEHICLES": [
        {
            "vehicleId": "0001",
            "routeName": "Ginza Line"
        },
        {
            "vehicleId": "0002"
            "routeName": "Another Line"
        }
}

我正在实现这样的排序功能:

onSearch : function (oEvent) {
    var sQuery = oEvent.getParameter("query");

    if (sQuery) {
        var oFilter1 = new Filter("vehicleId", function(value) {
            return value.includes("sQuery");
        });

        var oFilter2 = new Filter("routeName", function(value) {
            return value.includes("sQuery");
        });

        var allFilter = new Filter([oFilter1, oFilter2], false});
        var list = this.getView().byId("masterList");
        list.getBinding("items").filter(allFilter);
    } 
}

当我在搜索字段中输入“000”时,我希望返回两个数据项,但它没有返回。为什么?

我尝试了单个“vehicleId”过滤器,它起作用了。

我也试过了

var allFilter = new Filter({
    filters: [oFilter1, oFilter2], 
    and: false  //OR
});

但是 allFilter.b 并返回了undefined,我很困惑。

参考:

https://openui5.hana.ondemand.com/#docs/api/symbols/sap.ui.model.Filter.html

https://openui5.hana.ondemand.com/#docs/guide/96804e3315ff440aa0a50fd290805116.html#loio50357d719b35439984348080bcbb14a4

https://github.com/SAP/openui5/issues/1442

【问题讨论】:

  • 上面的代码只是一个小例子吗?否则,在这种情况下,应使用new Filter("vehicleId", FilterOperator.Contains, sQuery) 而不是自定义过滤器函数。这是example。 UI5 将负责规范化和大写搜索查询,这使得过滤更容易,更不容易出错。
  • @boghyon,是的,这也有效!我以为FilterOperator.Contains 只适用于odata 模型,我错了。

标签: sapui5


【解决方案1】:

有一个小错误。您正在检查 vehicleId includes 是否为字符串 "sQuery"。删除 sQuery 周围的引号,过滤器将正常工作。

value.includes(sQuery);

【讨论】:

  • 谢谢!有用!我发现在routeName中搜索没有用,然后我发现fnTest函数捕获的所有value都是大写的。你知道为什么吗?
  • @Tina:如果我们跟踪回调跟踪,我们可以看到字符串值是"normalized" and uppercased by the FilterProcessor module(那个 FilterProcessor 是由我们的 ListBinding 模块调用的)。 IMO,此行为应记录在 API 参考中的某处,但它不存在。
【解决方案2】:

感谢@boghyon 和@suryabhan mourya,我将fnTest 函数更改为

var oFilter1 = new Filter("vehicleId", function(value) {
    return value.includes(sQuery.toUpperCase());
});

它正在工作!

【讨论】:

    【解决方案3】:

    更新:

    根据 API document。将参数放入Array

    list.getBinding("items").filter([allFilter]);
    

    @boghyon从源代码here中发现其实是被转换成数组了

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 2021-08-06
    • 1970-01-01
    相关资源
    最近更新 更多