我想在两个控制器之间传递数据(除了路由参数),我想知道正确的方法。
例如:当我导航到模式/order/{id}
时,我在视图控制器中执行此操作:
this.getRouter().navTo("order", {
id: sOrderId
});
我想传递额外的JSON对象,我不想成为路由参数的一部分。
在这种情况下我该怎么办?
- 编辑 想要添加我喜欢的东西
我希望将数据从主数据传递到详细信息。主页面和详细信息页面都分配了单独的路由模式。因此用户可以直接登陆主人或细节。当他们落在主人身上时 - 用户可以选择一堆细节项目,并导航到第一个细节项目,并从那里导航到他/她之前在主人选择的其他项目。所以我想要传递的是从主控制器到细节控制器的选择。
通常,数据分别存储在模型中,而不是分配给局部变量并传递它们。然后可以与可以访问模型的任何东西共享模型数据(例如,查看数据绑定)。以下是客户端JSONModel的示例:
"sap.ui5": {
"models": {
"myModel": {
"type": "sap.ui.model.json.JSONModel"
}
}
}
const dataToPass = /*...*/
this.getOwnerComponent().getModel("myModel").setProperty("/data", dataToPass);
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
来传递数据。这是一个例子:
onInit: function() {
this.getView().addEventDelegate({
onBeforeHide: function(event) {
const targetView = event.to;
const dataToPass = /*...*/
targetView.data("data", dataToPass);
}
}, this);
},
onInit: function() {
this.getView().addEventDelegate({
onBeforeShow: function(event) {
/*Do sth with*/ this.getView().data("data");
}
}, this);
},
相关文档主题:Passing Data when Navigating
您可以创建本地模型(通常是JSONModel)并将其设置为应用程序Component内部。
// 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”));