我观看了一些关于导航+在视图之间传递数据的教程,但它在我的案例中并不起作用。 我的目标是实现以下目标:
导航工作正常,详情页面显示,但数据绑定似乎不起作用(没有数据显示) 我的想法是将JSON字符串传递给详细信息页面。我怎样才能做到这一点?还是有更优雅的方式?
以下是目前的代码:
MainView控制器
sap.ui.controller("my.zodb_demo.MainView", {
onInit: function() {
var oModel = new sap.ui.model.json.JSONModel("zodb_demo/model/products.json");
var mainTable = this.getView().byId("productsTable");
this.getView().setModel(oModel);
mainTable.setModel(oModel);
mainTable.bindItems("/ProductCollection", new sap.m.ColumnListItem({
cells: [new sap.m.Text({
text: "{Name}"
}), new sap.m.Text({
text: "{SupplierName}"
}), new sap.m.Text({
text: "{Price}"
})]
}));
},
onDetailsPressed: function(oEvent) {
var oTable = this.getView().byId("productsTable");
var contexts = oTable.getSelectedContexts();
var items = contexts.map(function(c) {
return c.getObject();
});
var app = sap.ui.getCore().byId("mainApp");
var page = app.getPage("DetailsForm");
//Just to check if the selected JSON String is correct
alert(JSON.stringify(items));
//Navigation to the Detail Form
app.to(page, "flip");
}
});
详情表单视图:
<mvc:View xmlns:core="sap.ui.core" xmlns="sap.m" xmlns:f="sap.ui.layout.form" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:mvc="sap.ui.core.mvc" controllerName="my.zodb_demo.DetailsForm">
<Page title="Details" showNavButton="true" navButtonPress="goBack">
<content>
<f:Form id="FormMain" minWidth="1024" maxContainerCols="2" editable="false" class="isReadonly">
<f:title>
<core:Title text="Information" />
</f:title>
<f:layout>
<f:ResponsiveGridLayout labelSpanL="3" labelSpanM="3" emptySpanL="4" emptySpanM="4" columnsL="1" columnsM="1" />
</f:layout>
<f:formContainers>
<f:FormContainer>
<f:formElements>
<f:FormElement label="Supplier Name">
<f:fields>
<Text text="{SupplierName}" id="nameText" />
</f:fields>
</f:FormElement>
<f:FormElement label="Product">
<f:fields>
<Text text="{Name}" />
</f:fields>
</f:FormElement>
</f:formElements>
</f:FormContainer>
</f:formContainers>
</f:Form>
</content>
</Page>
</mvc:View>
详细表格控制器:
sap.ui.controller("my.zodb_demo.DetailsForm", {
goBack: function() {
var app = sap.ui.getCore().byId("mainApp");
app.back();
}
});
答案 0 :(得分:14)
在控制器之间传递数据的推荐方法是使用EventBus
Mat img3 = Mat(img.rows, img.cols, img.type(), v.data()).clone();
您可以在控制器之间定义通道和事件。在您的DetailController上,您订阅了这样的事件:
sap.ui.getCore().getEventBus();
在您的MainController上发布事件:
onInit : function() {
var eventBus = sap.ui.getCore().getEventBus();
// 1. ChannelName, 2. EventName, 3. Function to be executed, 4. Listener
eventBus.subscribe("MainDetailChannel", "onNavigateEvent", this.onDataReceived, this);)
},
onDataReceived : function(channel, event, data) {
// do something with the data (bind to model)
console.log(JSON.stringify(data));
}
请参阅此处的文档:https://openui5.hana.ondemand.com/docs/api/symbols/sap.ui.core.EventBus.html#subscribe
答案 1 :(得分:3)
即使这个问题已经过时,这个场景今天仍然有效(它是一个典型的主 - 细节/ n对1场景)。另一方面,currently accepted solution不仅过时,而且还是XY-problem的结果。
有更优雅的方式吗?
绝对。看一下这个例子:https://embed.plnkr.co/F3t6gI8TPUZwCOnA?show=preview
无论使用什么控件(App,SplitApp或FlexibleColumnLayout),概念都是一样的:
getBindingContext(/*modelName*/)
navTo
参数(无需传递整个项目上下文)patternMatched
event onInit
arguments
,创建相应的密钥,通过该密钥可以唯一地标识目标条目。 In case of OData, use the API createKey
。bindElement
,以便将其上下文传播到详细信息视图。答案 2 :(得分:1)
您还可以设置本地json模型来存储数据,并在相应的视图中使用它。但一定要在合适的时间初始化或清除它。