SAP UI5中oDialog内sap.m.List触发itemPress切换模型显示空白问题
问题原因与解决方案
核心问题梳理
- 模型绑定路径未匹配命名模型:你调用
setModel时给新模型指定了名称"Model" + sPath,属于命名模型,但后续bindItems的path直接写"/",默认指向未命名的默认模型(也就是第一次绑定的主分类模型),自然无法匹配到新模型的数据,所以显示空白。 - BindingContext构造逻辑错误:
setBindingContext时你把模型名直接拼接在路径里的写法不符合SAPUI5规范,正确的Context构造仅需传入相对该模型的路径,命名模型需要在调用setBindingContext时单独传第二个参数指定模型名。 loadData参数使用错误:XMLModel.loadData的第二个参数是请求参数对象,你错误地将模型名作为入参传入,可能导致请求异常,即使你用的同步请求也存在参数传递风险。
修正方案
简化方案:直接使用默认模型(推荐)
无需使用命名模型,直接覆盖列表的默认模型即可,逻辑更简洁:
// 保留itemPress内原有前置逻辑 var sURL = '/XMII/Runner?Transaction=Project/trasnaction¶m1=' + param1; var oModel3 = new sap.ui.model.xml.XMLModel(); // loadData参数依次为:请求地址、请求参数、是否异步,不需要传参则第二个参数设为null oModel3.loadData(sURL, null, false); // 直接覆盖列表默认模型,替换原有主分类模型 oList.setModel(oModel3); // 直接绑定对应数据节点路径 oList.bindItems({ path: "/serviceInvocationResponse/responses", templateShareable: false, template: oTemplate }); // 验证逻辑可正常读取数据 var newData = oList.getModel().getProperty("/"); console.log("newData: ", newData);
保留命名模型的修正写法
如果需要保留命名模型,需在绑定路径中显式指定模型名:
var sModelName = "Model" + sPath; var sURL = '/XMII/Runner?Transaction=Project/trasnaction¶m1=' + param1; var oModel3 = new sap.ui.model.xml.XMLModel(); oModel3.loadData(sURL, null, false); oList.setModel(oModel3, sModelName); // 绑定路径添加模型名前缀 oList.bindItems({ path: sModelName + ">/serviceInvocationResponse/responses", templateShareable: false, template: oTemplate });
额外注意事项
SAPUI5 1.44版本属于老旧维护版本,同步XMLHttpRequest在部分现代浏览器中已存在废弃警告,条件允许的话建议改为异步请求,在requestCompleted事件回调中执行绑定逻辑,避免主线程阻塞。
内容的提问来源于stack exchange,提问作者DirtyFrank
相关产品推荐
相关产品推荐

