SAPUI5视图间数据交互求助:选中行数据传递方案
SAPUI5视图间数据交互解决方案
针对你需要在视图间传递表格选中行数据的需求,下面提供两种实用方案,都是新手易上手的实现方式:
方案一:使用全局JSON模型(适合多视图共享数据场景)
全局模型绑定在应用根组件(Component)上,所有视图都能直接访问,适合需要在多个视图间复用数据的场景。
- 创建全局模型
在Component.js的init方法中初始化全局模型,确保应用启动时就存在:
init: function() { // 调用父类初始化方法 sap.ui.core.UIComponent.prototype.init.apply(this, arguments); // 创建全局JSON模型,初始为空对象 var oGlobalModel = new sap.ui.model.json.JSONModel({ selectedRow: {} // 用于存储选中行数据 }); // 将模型绑定到组件,指定命名空间"globalData"避免冲突 this.setModel(oGlobalModel, "globalData"); // 初始化路由(已有代码可保留) this.getRouter().initialize(); }
- 源视图更新全局模型
在表格的selectionChange事件中,获取选中行数据并更新全局模型:
onTableSelectionChange: function(oEvent) { // 获取选中的行对象 var oSelectedItem = oEvent.getParameter("listItem"); // 获取选中行绑定的数据对象 var oSelectedData = oSelectedItem.getBindingContext().getObject(); // 通过组件获取全局模型并更新数据 this.getOwnerComponent().getModel("globalData").setProperty("/selectedRow", oSelectedData); // 执行你已完成的导航逻辑 this.getRouter().navTo("TargetView"); }
- 目标视图读取全局模型数据
在目标视图控制器的onInit方法中读取数据,或直接在XML视图中绑定:
onInit: function() { // 获取全局模型 var oGlobalModel = this.getOwnerComponent().getModel("globalData"); // 获取选中行数据 var oSelectedRow = oGlobalModel.getProperty("/selectedRow"); // 后续业务处理,比如赋值给本地模型或操作控件 console.log("选中行数据:", oSelectedRow); }
XML视图绑定示例:
<Text text="{globalData>/selectedRow/yourFieldName}"/>
方案二:导航时直接传递参数(适合单次数据传递场景)
如果只是单次导航传递数据,不需要全局共享,可直接通过路由参数传递,步骤更简洁:
- 源视图导航时传递参数
在导航方法中,将选中行数据序列化为JSON字符串后作为路由参数传递:
onTableSelectionChange: function(oEvent) { var oSelectedItem = oEvent.getParameter("listItem"); var oSelectedData = oSelectedItem.getBindingContext().getObject(); // 路由参数仅支持字符串,需将数据转为JSON字符串 var sDataStr = JSON.stringify(oSelectedData); // 导航时传入参数 this.getRouter().navTo("TargetView", { selectedData: sDataStr }); }
- 目标视图获取并解析参数
在目标视图的路由匹配事件中获取参数并反序列化:
onInit: function() { // 监听路由匹配事件 this.getRouter().getRoute("TargetView").attachMatched(this.onRouteMatched, this); }, onRouteMatched: function(oEvent) { // 获取路由参数 var oArgs = oEvent.getParameter("arguments"); // 反序列化JSON字符串为数据对象 var oSelectedData = JSON.parse(oArgs.selectedData); // 业务处理逻辑 console.log("传递过来的数据:", oSelectedData); }
注意事项
- 全局模型适合多视图复用的数据;单次传递优先用路由参数,避免全局数据冗余。
- 路由参数传递复杂对象必须序列化,否则会丢失数据结构。
- 尽量通过
getOwnerComponent()获取模型,而非sap.ui.getCore().getModel(),更符合组件化开发规范。
内容的提问来源于stack exchange,提问作者Hassen Elec
相关产品推荐
相关产品推荐

