我在智能过滤条上创建了自定义控件。我不确定如何将选择传递给服务器,以便更新过滤器并将数据重新绑定到智能表。这是自定义smartfilter栏:
<smartFilterBar:ControlConfiguration groupId="_BASIC" key="ZQ_STAT" visibleInAdvancedArea="true" preventInitialDataFetchInValueHelpDialog="false" >
<smartFilterBar:customControl>
<Select id="qualStatusDropDown" change="onQualSearch">
<core:Item key="" text=" " />
<core:Item key="0" text="0" />
<core:Item key="1" text="ONE" />
<core:Item key="2" text="TWO" />
<core:Item key="3" text="THREE" />
</Select>
</smartFilterBar:customControl>
以下是我在控制器中使用的代码:
onQualSearch : function (oEvent) {
var oTableSearchState = [];
var sQuery = oEvent.getSource().getProperty("selectedKey");
oTableSearchState = [new Filter("ZQ_STAT", FilterOperator.EQ, sQuery)];
this._applyFilter(oTableSearchState);
//MessageToast.show("You picked " + sQuery);
},
_applyFilter: function(oTableSearchState) {
var oTable = this.byId("gSmartTable");
//oTable.getBinding("items").filter(oTableSearchState, "Application");
}
我在标准表和搜索字段上使用了此代码,但是我在控制台中收到错误,声明“getBinding”#39;未定义。如果我输出&#39; oTable&#39;反对控制台,我可以看到&#39;项目&#39;聚合确实存在,但我想也许我没有调用正确的聚合。我花了一些时间试图确定如何获得当前表绑定的内容,尽管它始终是空白的。我正在使用&#39; enableAutoBinding = true&#39;在桌面上,当我禁用它并将该属性输出到控制台时,即使我应用了过滤器搜索,它仍然总是空白。
当我使用其他可用字段之一(这只是一个标准的智能过滤器)时,我可以看到网络选项卡中的oData调用修改了查询并添加了“过滤器”&#39;到查询。这样:
/Employees?$skip=0&$top=20&$select=Pernr,STEXT_2,Butxt,STLTX,ZQ_STAT
vs this(过滤后):
/Employees?$skip=0&$top=20&$filter=(Butxt eq 'XXXXX')&$select=Pernr,STEXT_2,Butxt,STLTX,ZQ_STAT
我确定我错过了一些简单的事情,或者我只是想错了。任何人都可以协助下一步做什么吗?
编辑:我对此更加接近了。查看此示例后:我意识到绑定参数只存在于'beforeRebindTable&#39;事件。我将该事件添加到控件并更新了我的脚本:
onQualSearch : function (oEvent) {
var oSmartTable = this.byId("gSmartTable");
oSmartTable.rebindTable();
//oSmartTable.showOverlay();
},
onBeforeRebindTable : function(oEvent) {
// Get bindinParams Object, which includes filters
var oBindingParams = oEvent.getParameter("bindingParams");
// Create the aFilters array
var aFilters = oBindingParams.filters;
// Create the table object
var oSmartTable = oEvent.getSource();
// Get the SmartFilterBarID
var oSmartFilterBar = this.byId(oSmartTable.getSmartFilterId());
if (oSmartFilterBar instanceof sap.ui.comp.smartfilterbar.SmartFilterBar) {
var oCustomControl = oSmartFilterBar.getControlByKey("ZQ_STAT");
if (oCustomControl instanceof sap.m.Select) {
var sQualStat = oCustomControl.getSelectedKey();
oBindingParams.filters.push(new sap.ui.model.Filter("ZQ_STAT", "EQ", sQualStat));
}
}
},
&#13;
现在唯一的问题是叠加似乎不起作用;过滤后的数据在桌面上,但它是灰色的。我添加了&#39; .showOverlay();&#39;函数,它正确显示过滤后的数据,但是我在控制台中出现了一个错误,即showOverlay&#39;不是一个功能。它没有出现在原型中(我记录了oSmartTable对象),除了&#39; _showOverlay&#39;。我也尝试过运行该功能,虽然不显示叠加层,但它没有出错。
我确定它很简单,任何帮助都会受到赞赏。
干杯!
编辑2:我认为由于我对现在如何运作有所了解,我几乎得到了回答。如果用户在智能过滤条上的任何其他字段中放置了一些文字,则必须按Enter键或“去”。过滤器实际运行的按钮。对于下拉列表,这是相同的。出于某种原因,我认为一旦选中下拉列表中的项目,我就能自动重新绑定并刷新表格列表。虽然我可以使用&#39; rebindTable();&#39;函数重置表绑定,它不会显示非灰色状态的新数据,直到我点击“去”。或输入。因此,从用户的角度来看,为了保持一致,如果我省略了“onQualSearch”。事件,然后下拉菜单就像SmartFilterBar中的任何其他字段一样 - 用户输入/选择输入,然后点击“去”。按钮或回车键。
我也错误地识别了showOverlay()&#39;作为一种功能,当它实际上是一个事件时,这就是为什么我不能只调用“oSmartTable.showOverlay();&#39;”。我也可能使用了不正确的命名法,识别出覆盖层&#39;作为表数据的灰色与非灰色状态。这就是我所指的:
VS
我可以通过这个SAPUI5以及一般的Javascript来学习这个体验,因为这两个对我来说都是新手。对不起,如果这引起任何混淆。
无论如何,如果有人知道在更改后立即显示数据的方法,请添加评论/建议!
希望这篇文章至少可以帮助其他人尝试做类似的事情!