有几种方法可以做到这一点.. 但是对于您当前的代码,我建议如下:
对您的问题的简短回答:
FilterBar 有一个方法determineControlByFilterItem,您可以使用该方法获取筛选项的控件,然后您可以使用该方法获取选定的值。
var oFilterItem = oEvent.getSource().getFilterItems()[0];
var oControl = oFilterBar.determineControlByFilterItem(oFilterItem);
var sSelectedValue = oControl.getSelectedKey();
不过,在对这样的数组索引进行硬编码时要小心。为了更完整地解决您的问题,我在下面建议了一个完整的方法。
如果您想使用过滤器栏过滤结果集,答案很长:
首先,确保过滤器项目的名称与您要过滤的属性的名称一致。因此,在您的情况下,您的过滤器项目被命名为“A”和“B”......我建议您更改它们以匹配您要过滤的属性名称。假设您要过滤的属性名称是“用户”和“位置”:
<FilterItem name="User" label="User">
...
<FilterItem name="Location" label="Location">
...
然后在您的控制器中,您可以使用这些名称来构建一个 sap.ui.model.Filter 对象数组,您可以使用这些对象来过滤您的结果集。
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);
}
我之所以建议这种方法而不是其他方法,是因为它可以很好地扩展。例如,假设您想添加第三个Select 控件作为过滤依据,您只需添加一个新的<FilterItem name="NewFilterProperty" label="New Filter Property">。因为我们没有将任何东西硬编码到事件处理程序中,所以它仍然可以在没有任何额外更改的情况下工作。
唯一需要注意的是您是否在 FilterBar 中使用了不同类型的控件。因此,例如,如果您添加了 <Input> 而不是 <Select>,则需要调整事件处理程序的逻辑来处理此问题。
我通常会这样做:
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;
});
}