我想在两个控制器之间传递数据(除了路由参数之外),并且我想知道执行此操作的正确方法。
例如:当我导航到模式时/order/{id}
,我在视图控制器中执行以下操作:
this.getRouter().navTo("order", {
id: sOrderId
});
Run Code Online (Sandbox Code Playgroud)
我想传递额外的 JSON 对象,我不想让它成为路由参数的一部分。
这种情况我该怎么办?
--edit
想添加我想通过此实现的目标
我想要将数据从主控传递到详细信息。主页面和详细信息页面都分配了单独的路由模式。因此用户可以直接登陆大纲或详细信息。当他们登陆主控时 - 用户可以选择一堆详细信息项目,然后导航到第一个详细信息项目,然后从那里导航到他/她之前在主控上选择的其他项目。所以我要传递的是从主控制器到细节控制器的选择。
注意:如果目的是将选定的键从主视图传递到详细视图,请参阅/sf/answers/3420940561/。
通常,数据单独存储在模型中,而不是分配给局部变量并传递它们。然后,模型数据可以与任何可以访问模型的对象共享(例如数据绑定视图)。下面是一个客户端模型的示例 ( JSONModel
):
创建一个JSONModel
在父级上设置的ManagedObject
。例如在组件上通过manifest.json
:
"sap.ui5": {
"models": {
"myModel": {
"type": "sap.ui.model.json.JSONModel"
}
}
}
Run Code Online (Sandbox Code Playgroud)
在控制器 A中,在导航之前设置要通过的对象:
const dataToPass = /*...*/
this.getOwnerComponent().getModel("myModel").setProperty("/data", dataToPass, null, true);
Run Code Online (Sandbox Code Playgroud)
在控制器 B中,对传递的数据执行一些操作。例如在patternMatched
处理程序上:
onInit: function() {
const orderRoute = this.getOwnerComponent().getRouter().getRoute("order");
orderRoute.attachPatternMatched(this.onPatternMatched, this);
},
onPatternMatched: function() {
/*Do something with:*/this.getOwnerComponent().getModel("myModel").getProperty("/data");
},
Run Code Online (Sandbox Code Playgroud)
NavContainer(Child)
事件有几个与导航相关的事件,例如navigate
、
BeforeHide
、BeforeShow
等,它们包含两个视图 - 源视图 ( from
) 和目标视图 ( to
)。
您可以利用 APIdata
来传递数据。这是一个例子:
在控制器A中:
onInit: function() {
this.getView().addEventDelegate({
onBeforeHide: function(event) {
const targetView = event.to;
const dataToPass = /*...*/
targetView.data("data", dataToPass);
}
}, this);
},
Run Code Online (Sandbox Code Playgroud)
在控制器 B中:
onInit: function() {
this.getView().addEventDelegate({
onBeforeShow: function(event) {
/*Do something with:*/this.getView().data("data");
}
}, this);
},
Run Code Online (Sandbox Code Playgroud)
另请参阅相关文档主题:导航时传递数据