如何根据表行数据在表下拉列表中设置过滤器

时间:2014-08-19 11:03:41

标签: javascript sapui5

以下问题由SCN上的这个SAPUI5主题驱动:2 dropdownboxs, filtering second off the the value in first

  • 我们有一个SAPUI5表,包含两列,表中的每条记录都显示一个下拉列表:一个用于分部,一个用于业务单位。
  • 根据所选部门的价值,业务部门下拉列表应仅显示对所选部门有效的BU
  • 实际表数据存储在命名模型tablemodel中,下拉列表的数据存储在命名模型metamodel

请参阅下面表格的示例:

This is what the table should look like

为了能够过滤分部上的业务单位,命名模型metamodel如下所示:

divisions: [
    {
        division    : "div1",
        divisiondesc: "Division 1"
    }, 
    {
        division    : "div2",
        divisiondesc: "Division 2"
    }, //etc
],
bunits: [
    {
        busunit    : "bus1",
        busunitdesc: "Business Unit 1",
        division   : "div1"
    }, 
    {
        busunit    : "bus2",
        busunitdesc: "Business Unit 2",
        division   : "div3"
    }, //etc
]

所以可以在属性/bunits上过滤第二个下拉列表(绑定到division)。

sap.ui.commons.table.Table内置于JSView组件中,如下所示:

var oTable = new sap.ui.table.Table()
    //First column w/ dropdown Divisions
    .addColumn(new sap.ui.table.Column({
        label: new sap.ui.commons.Label({
            text: "Division"
        }),
        template: new sap.ui.commons.DropdownBox({
            selectedKey: "{tablemodel>division}",
            items: {
                path: "metadatamodel>/divisions",
                template: new sap.ui.core.ListItem({
                    text: "{metadatamodel>divisiondesc}",
                    key: "{metadatamodel>division}"
                })
            }
        })
    }))
    //Second column w/ dropdown Business Units, which should be filtered
    .addColumn(new sap.ui.table.Column({
        label: new sap.ui.commons.Label({
            text: "Business Unit"
        }),
        template: new sap.ui.commons.DropdownBox({
            selectedKey: "{tablemodel>bus_unit}",
            items: {
                path: "metadatamodel>/bunits",
                template: new sap.ui.core.ListItem({
                    text: "{metadatamodel>busunitdesc}",
                    key: "{metadatamodel>busunit}"
                })
                ,
                filters: [new sap.ui.model.Filter("division", sap.ui.model.FilterOperator.EQ, "{tablemodel>division}")]
            }
        })
    }))
    .bindRows("tablemodel>/");

从上面可以看出,预期的行为是第二​​个下拉列表将在属性division上使用当前表的division属性的值(即{tablemodel>division})进行过滤

(完整代码is available in this JSbin project

然而...

由于某种原因,当前当前表的division属性的值未被识别,或者在创建过滤器时根本没有设置(我无法分辨哪个是真的),导致空第二个下拉列表(即没有有效的过滤器)。

错误因此在于这一行代码的值绑定:

filters: [new sap.ui.model.Filter("division", sap.ui.model.FilterOperator.EQ, "{tablemodel>division}")]

我的问题是:

  1. 是否可以在表格中以这种方式设置过滤器,即使用{tablemodel>division}等数据绑定为每一行设置过滤器值?我知道它在表外工作,但在这种情况下,下拉列表是一个与表数据相对绑定的模板
  2. 如果不可能,我应该如何让它工作?我怀疑数据绑定应该隐式工作,但由于某种原因它不会
  3. 限制:

    理想情况下,我不想在第一个下拉列表中使用onChange事件,因为第二个下拉列表应该已根据可用的表数据进行过滤,而不是使用第一个下拉列表进行选择更改

    任何帮助将不胜感激!

    =============================================== ==

    编辑:我刚刚测试了一个只有一个下拉列表的页面,并且它也无法正常工作!...

    如果我使用过滤器值,数据绑定指定了过滤器值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"
    })
    

    然后过滤器按预期工作。

    底线:

      

    我们不能使用数据绑定来指定过滤器值吗?

1 个答案:

答案 0 :(得分:2)

true 我们不能使用数据绑定来指定过滤器值。请查看您的另一个问题Not possible to set Filter value using data binding?的答案。