SAPUI5自动绑定Smart Table加载OData时过滤无效问题求助
解决SmartTable自动绑定下OData过滤不生效的问题
你的问题核心在于启用了enableAutoBinding=true的SmartTable会自动触发数据请求,而你当前控制器里的手动oModel.read()操作并没有关联到SmartTable的绑定上下文,所以过滤条件根本没作用到SmartTable的数据加载上。另外,你设置模型的时机也不对,应该先把模型绑定到视图,再让SmartTable自动完成绑定流程。
下面给你两种可行的解决方案,推荐用第一种(利用SmartTable的专属事件):
方案一:使用beforeRebindTable事件添加过滤
这是SAP官方推荐的方式,因为beforeRebindTable是SmartTable在发起数据请求前触发的事件,专门用来修改绑定参数(过滤、排序、分页等)。
步骤1:给SmartTable添加事件绑定
修改你的视图代码,新增beforeRebindTable事件绑定:
<smartTable:SmartTable id="mytable" entitySet="SampleDetail" tableType="ResponsiveTable" useExportToExcel="false" beforeExport="onBeforeExport" beforeRebindTable="onBeforeRebindTable" <!-- 新增事件绑定 --> useVariantManagement="false" useTablePersonalisation="true" header="{i18n>tickets_table_header}" showRowCount="true" persistencyKey="ticketsSmartTable_persis" enableAutoBinding="true" demandPopin="true" class="sapUiResponsiveContentPadding" > </smartTable:SmartTable>
步骤2:在控制器中实现事件处理函数
先正确初始化模型并绑定到视图,再在事件回调中添加过滤条件:
onInit: function() { // 初始化OData模型并绑定到视图 var serviceURL = this.getConfiguration("myDestination") + "sample.xsodata"; var oModel = new sap.ui.model.odata.v2.ODataModel(serviceURL, { useBatch: false }); this.getView().setModel(oModel); }, onBeforeRebindTable: function(oEvent) { // 获取绑定参数对象 var oBindingParams = oEvent.getParameter("bindingParams"); // 构建过滤条件 var filtersDef = []; filtersDef.push(new sap.ui.model.Filter("STATUS", sap.ui.model.FilterOperator.NE, "D")); // 合并过滤条件(避免覆盖SmartTable自带的其他过滤参数) oBindingParams.filters = oBindingParams.filters ? oBindingParams.filters.concat(filtersDef) : filtersDef; }
方案二:手动获取SmartTable绑定并设置过滤
如果你不想用事件的方式,也可以在视图渲染完成后,手动获取SmartTable的列表绑定并添加过滤:
onAfterRendering: function() { var oSmartTable = this.getView().byId("mytable"); var oTable = oSmartTable.getTable(); var oBinding = oTable.getBinding("items"); if (oBinding) { var filtersDef = []; filtersDef.push(new sap.ui.model.Filter("STATUS", sap.ui.model.FilterOperator.NE, "D")); oBinding.filter(filtersDef); } }
注意:这种方式要确保SmartTable已经完成初始化,所以放在
onAfterRendering或者用延迟执行更稳妥,但还是推荐方案一的事件方式,更符合SAP的最佳实践。
为什么你的原代码不生效?
- 手动调用
oModel.read()只是单独获取了数据,但并没有把结果关联到SmartTable的绑定上,SmartTable还是会按照自动绑定的逻辑请求全量数据。 - 你在
read的success回调里才设置模型,这时候SmartTable可能已经完成了自动绑定请求,模型设置的时机太晚了。
内容的提问来源于stack exchange,提问作者tarzanbappa
相关产品推荐
相关产品推荐

