我想在两个控制器之间传递数据(除了路由参数),我想知道正确的方法。
例如:当我导航到模式/order/{id}
时,我在视图控制器中执行此操作:
this.getRouter().navTo("order", {
id: sOrderId
});
我想传递额外的JSON对象,我不希望它成为路由参数的一部分。
在这种情况下我该怎么做?
- 编辑
想要添加我喜欢的内容
我希望将数据从主数据传递到详细信息。主页面和详细信息页面都分配了单独的路由模式。因此用户可以直接登陆主人或细节。当他们落在主人身上时 - 用户可以选择一堆细节项目,并导航到第一个细节项目,并从那里导航到他/她之前在主人选择的其他项目。所以我想要传递的是从主控制器到细节控制器的选择。
答案 0 :(得分:2)
通常,数据分别存储在模型中,而不是分配给局部变量并传递它们。然后可以与可以访问模型的任何东西共享模型数据(例如,查看数据绑定)。 以下是客户端JSONModel的示例:
创建在父ManagedObject上设置的客户端JSONModel。例如。在Component上通过manifest.json:
"sap.ui5": {
"models": {
"myModel": {
"type": "sap.ui.model.json.JSONModel"
}
}
}
在控制器A 中,在导航前设置要传递的对象:
const dataToPass = /*...*/
this.getOwnerComponent().getModel("myModel").setProperty("/data", dataToPass);
在控制器B 中,对传递的数据执行某些操作。例如。在patternMatched
处理程序:
onInit: function() {
const orderRoute = this.getOwnerComponent().getRouter().getRoute("order");
orderRoute.attachPatternMatched(this.onPatternMatched, this);
},
onPatternMatched: function() {
/*Do sth with*/ this.getOwnerComponent().getModel("myModel").getProperty("/data");
},
有几个与导航相关的事件,例如navigate
,
BeforeHide
,BeforeShow
等包含两个视图的视图 - 源视图(from
)和目标视图(to
)。
您可以使用API data
来传递数据。
这是一个例子:
在控制器A
中onInit: function() {
this.getView().addEventDelegate({
onBeforeHide: function(event) {
const targetView = event.to;
const dataToPass = /*...*/
targetView.data("data", dataToPass);
}
}, this);
},
在控制器B
中onInit: function() {
this.getView().addEventDelegate({
onBeforeShow: function(event) {
/*Do sth with*/ this.getView().data("data");
}
}, this);
},
相关文档主题: Passing Data when Navigating
答案 1 :(得分:0)
您可以创建本地模型(通常是JSONModel)并将其设置为应用程序组件内部。
// inside Component.js
var model = new sap.ui.model.json.JSONModel({ foo: “bar”});
this.setModel(model);
在每个控制器内部,您可以使用
var model = this.getOwnerComponent().getModel();
console.log(model.getProperty(“/foo”));