SAPUI5筛选栏获取筛选栏中每个筛选项的筛选值

SAPUI5筛选栏获取筛选栏中每个筛选项的筛选值,sapui5,Sapui5,我有一个包含多个筛选器项的筛选器栏,需要在onSearch事件中获取每个筛选器项的选定/键入值。我已经尝试过,但无法找到一种方法来获取所有筛选器项的所有筛选器数据 <fb:FilterBar reset="onReset" search="onSearchFilterbar" showRestoreButton="true" showClearButton="true" filt

我有一个包含多个筛选器项的筛选器栏,需要在onSearch事件中获取每个筛选器项的选定/键入值。我已经尝试过,但无法找到一种方法来获取所有筛选器项的所有筛选器数据

<fb:FilterBar reset="onReset"
              search="onSearchFilterbar"
              showRestoreButton="true"
              showClearButton="true"
              filterBarExpanded="false"
            id="userFilterBar">
    <fb:filterItems>
        <fb:FilterItem name="A" label="User">
            <fb:control>
                <Select id="slcUser" forceSelection="false"
                        items="{ path: 'sysusers>/Users' , sorter: { path: 'Name' } }" >
                    <core:Item key="{sysusers>Name}" text="{sysusers>Name}"/>
                </Select>
            </fb:control>
        </fb:FilterItem>
        <fb:FilterItem name="B" label="Location">
            <fb:control>
                <Select id="slcLocation" forceSelection="false"
                        items="{ path: 'location>/Locations' , sorter: { path: 'Name' } }">
                    <core:Item key="{location>Name}" text="{location>Name}"/>
                </Select>
            </fb:control>
        </fb:FilterItem>
    </fb:filterItems>
</fb:FilterBar>  



onsearch:function(oEvent){
    oEvent.getSource().getFilterItems()[0];
    // But cannot find a way to get the selected data
}

onsearch:功能(oEvent){
oEvent.getSource().getFilterItems()[0];
//但无法找到获取所选数据的方法
}

项目的值取决于de事件的参数

oEvent.getParameter('0').selectionSet
它是一个数组,每个控件都有
filterbar
,您可以使用:

oEvent.getParameter('0').selectionSet[0].getValue()

有几种方法可以做到这一点。在国际海事组织,最好的方法是使用模型。这就是采用MVC方法。这是一个有效的例子


MVC
sap.ui.define([
“jquery.sap.global”,
“sap/ui/core/mvc/Controller”,
'sap/ui/model/json/JSONModel'
],函数(jQuery、控制器、JSONModel){
“严格使用”;
var oController=Controller.extend(“myView.Template”{
onInit:function(){
var oView=this.getView();
setModel(新的JSONModel({
用户:“”,
地点:“
})“选择”);
setModel(新的JSONModel({
用户:[
{名称:“约翰多”},
{姓名:“玛丽安”}
]          
})“系统用户”);
setModel(新的JSONModel({
地点:[
{名称:“伦敦”},
{名称:“巴黎”}
]          
})“地点”);
},
onSearchFilterbar:功能(oEvent){
log(this.getView().getModel(“选择”).getData());
}
});
返回控制器;
});
var oView=sap.ui.xmlview({
viewContent:jQuery('#oView').html()
});
oView.placeAt(“内容”);

有几种方法可以做到这一点。。但根据您当前的代码,我建议如下:

您问题的简短答案:

过滤器栏有一个方法
determineControlByFilterItem
,您可以使用该方法获取过滤器项的控件,然后使用该控件获取所选值

var oFilterItem = oEvent.getSource().getFilterItems()[0];
var oControl = oFilterBar.determineControlByFilterItem(oFilterItem);
var sSelectedValue = oControl.getSelectedKey();
但是,在硬编码这样的数组索引时要小心。为了更完整地解决您的问题,我在下面建议了一个完整的方法

如果要使用筛选栏筛选结果集,请选择长答案:

首先,确保筛选项的名称与要筛选的属性的名称对齐。所以在你的例子中,你的过滤项被命名为“A”和“B”。。。我建议您将其更改为与要筛选的属性名称相匹配。假设要筛选的属性的名称为“用户”和“位置”:

我之所以建议使用这种方法而不是其他方法,是因为它可以很好地扩展。例如,假设您想添加第三个
选择要筛选的
控件,只需添加一个新的
。因为我们没有将任何内容硬编码到事件处理程序中,所以在没有任何额外更改的情况下,它仍然可以工作

唯一需要注意的是,如果在过滤器中使用不同类型的控件。因此,例如,如果添加了
而不是
,则需要调整事件处理程序的逻辑来处理此问题

我通常会这样做:

onSearch: function(oEvent) {
    var oFilterBar = oEvent.getSource();
    var aFilterItems = oFilterBar.getFilterItems();
    var aFilters = aFilterItems.map(function(oFilterItem) {
        var sFilterName = oFilterItem.getName();
        var oControl = oFilterBar.determineControlByFilterItem(oFilterItem);
        var sValue;
        if (oControl.getMetadata().getName() === "sap.m.Select") {
            sValue = oControl.getSelectedKey();
        } else if (oControl.getMetadata().getName() === "sap.m.Input") {
            sValue = oControl.getValue();
        }
        var oFilter = new sap.ui.model.Filter(sFilterName, "EQ", sValue);
        return oFilter;
    });

}

您试图获取筛选项的代码是什么?这是一种效率低下的方式,无法获得预期的结果,并且实际上无法提供太多的扩展能力?为什么不进行缩放?对于多输入控件之类的对象,您将很难使用JSON模型来设置/获取SAPUI5中tokensevery控件的值,因为它可以将值绑定到模型。这就是SAPUI5的美妙之处,我们将视图和控制器分离开来。我们不希望控制器具有直接从控件获取值的代码。通过这种方式,控制器可以更改,控制器代码保持不变。我们今天有sap.m.Select,明天有sap.m.Input。视图改变,控制器实现保持不变。我基本上同意。但在某些情况下,这并不完全正确。例如,如果要添加具有多个令牌的多输入控件,则控制器必须在JSON模型中维护一个令牌值数组。或者一个只允许绑定到selectedIndex的RadioButtonGroup,控制器需要使用selectedIndex来获取所选单选按钮的文本。虽然这是获取值的一种方法,但应避免对数组索引进行硬编码。不要说硬编码,只要告诉他过滤器在哪里,有一些方法可以获取字段名
<FilterItem name="User" label="User">
...
<FilterItem name="Location" label="Location">
...
onSearch: function(oEvent) {
    //get the filter bar from the event
    var oFilterBar = oEvent.getSource();

    //get the filter items from the filter bar
    var aFilterItems = oFilterBar.getFilterItems();

    //map the array of FilterItems to a new array of sap.ui.model.Filter objects
    var aFilters = aFilterItems.map(function(oFilterItem) {
        //get the filter item name (which is now the same as the filter property name)
        var sFilterName = oFilterItem.getName();

        //use the filter bar to get the control for the filter item
        var oControl = oFilterBar.determineControlByFilterItem(oFilterItem);

        //use the control to get the selected value (selected key)
        var sSelectedValue = oControl.getSelectedKey();

        //use the filter item/property name and the selected value to create a new sap.ui.model.Filter
        var oFilter = new sap.ui.model.Filter(sFilterName, "EQ", sSelectedValue);

        //return the Filter object to the new array
        return oFilter
    });

    //use the array of sap.ui.model.Filter objects to filter your table

    //if you're using a responsive table (sap.m.Table), use:
    this.getView().byId("yourTableId").getBinding("items").filter(aFilters);

    //or if you're using a grid table (sap.ui.table.Table), use:
    this.getView().byId("yourTableId").getBinding("rows").filter(aFilters);
}
onSearch: function(oEvent) {
    var oFilterBar = oEvent.getSource();
    var aFilterItems = oFilterBar.getFilterItems();
    var aFilters = aFilterItems.map(function(oFilterItem) {
        var sFilterName = oFilterItem.getName();
        var oControl = oFilterBar.determineControlByFilterItem(oFilterItem);
        var sValue;
        if (oControl.getMetadata().getName() === "sap.m.Select") {
            sValue = oControl.getSelectedKey();
        } else if (oControl.getMetadata().getName() === "sap.m.Input") {
            sValue = oControl.getValue();
        }
        var oFilter = new sap.ui.model.Filter(sFilterName, "EQ", sValue);
        return oFilter;
    });

}