我正在建立一个表,当单击“项目”时,该表具有详细视图。我要实现的方式如下:
表控制器 这就是显示我所有从oData接口加载的表条目的逻辑。
onInit: function() {
var serviceUrl = "/sap/opu/odata/sap/ZSS18_T4_UNIVERSITY_SRV";
var oModel = new sap.ui.model.odata.v2.ODataModel(serviceUrl);
this.getView().setModel(oModel);
},
handleLineItemPress : function(evt){
// Create App object
var app = new sap.m.App({
initialPage : this.createId("idDetail1")
});
// create detail page
var page = sap.ui.view({
id : this.createId("idDetail1"),
viewName: "zss18_t4.projectDetail",
type : sap.ui.core.mvc.ViewType.XML
});
// Pass Data to detail page
var context = evt.getSource().getBindingContext();
console.log(context);
app.to(page, { ctx : context});
// Show detail page in app
app.addPage(page);
app.placeAt("content", "only");
}
详细信息页面 现在,我想在新页面上显示单个项目的详细信息,其控制器在这里:
onInit: function() {
var serviceUrl = "/sap/opu/odata/sap/ZSS18_T4_UNIVERSITY_SRV";
var oModel = new sap.ui.model.odata.v2.ODataModel(serviceUrl);
var view = this.getView();
this.getView().setModel(oModel);
this.getView().addDelegate({
onBeforeShow : function(evt) {
view.setBindingContext(evt.data.ctx);
}
});
},
这是对应的视图:
<core:View xmlns:core="sap.ui.core" xmlns:mvc="sap.ui.core.mvc" xmlns="sap.m"
controllerName="zss18_t4.projectDetail" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:f="sap.ui.layout.form">
<Page title="Details">
<VBox class="sapUiSmallMargin">
<f:SimpleForm id="projectDetails" title="Project Details">
<f:content>
<Label text="Project ID" />
<Text text="{projid}" />
<Label text="Title" />
<Text text="{title}" />
<Label text="Description" />
<Text text="{description}" />
<Label text="Type" />
<Text text="{type}" />
<Label text="Supervisor" />
<Text text="{supervisor}" />
<Label text="Lead" />
<Text text="{lead}" />
<Label text="Members" />
<Text text="{members}" />
<Label text="Status" />
<Text text="{status}" />
<Label text="Startdate" />
<Text text="{startdate}" />
<Label text="Enddate" />
<Text text="{enddate}" />
</f:content>
</f:SimpleForm>
</VBox>
</Page>
我已经阅读过类似的文章,但尚未找到正确的解决方案。在此先感谢您对我的帮助!
答案 0 :(得分:1)
从oData服务获取数据时,可以使用本地模型。
您可以这样致电Odata服务:
var modelTab = this.getView().getModel( "localModel" ),
this.getView().getModel( "MyOdataService" ).read( entitySet, {
filters: [ filter ],
success: function( oData ) {
modelTab.setProperty("/", oData.results );
},
error: function( oError ) {
}
});
就像您可以在xml视图上随意使用模型一样
喜欢:
<Label text="Project ID" />
<Text text="{localModel>/projid}" />
就像您可以调试odata请求的结果一样。
谢谢。
答案 1 :(得分:0)
我仔细检查了oData服务的工作方式,偶然发现了以下博客文章(不幸的是德语):http://fiori.acando-live.de/2018/04/03/odata-model-wie-kommen-die-daten-in-meine-anwendung/它表示在某些情况下,您必须执行适当的oModel.read()才能加载前端的实际数据,这里丢失了。 我添加了 oModel.read()来从后端检索实际的数据集。上下文是正确的,但是没有可用数据。
这是我对项目控制器的实现,它可以正确显示数据:
onInit: function() {
var serviceUrl = "/sap/opu/odata/sap/ZSS18_T4_UNIVERSITY_SRV";
var oModel = new sap.ui.model.odata.v2.ODataModel(serviceUrl);
oModel.read("/ZSS18_T4_PROJSet")
var view = this.getView();
this.getView().setModel(oModel);
this.getView().addDelegate({
onBeforeShow : function(evt) {
view.setBindingContext(evt.data.ctx);
}
});
},