我正在编写一个OpenUI5应用程序,使用TileContainer Launchpad,SplitContainer,Master和Detail页面。 SplitContainer需要为三个不同的模型提供服务,每个模型具有相同的结构(但数据不同)。这意味着主模型和细节被重用于每个模型,但我必须告诉主模型它使用的模型。顺序是:
展示了Launchpad磁贴
data = model.getData(); // from model, includes an attribute 'model'
// to tell the subsequent page which model to use
if (data && data.Menu) {
for (m = 0; m < data.Menu.length; m++) {
menu = data.Menu[m];
tc.addTile(new sap.m.StandardTile({
icon: menu.icon,
title: menu.title,
info: menu.title,
press: navFn(menu.model) // here, the model to use is passed in the function params
}));
}
}
用户在“press”事件中点击具有特定参数的tile,以指示要使用的模型。导航功能使用数据有效负载引发事件,App控制器处理导航。这很有效。
this.bus.publish("nav", "to", {
id: "my.Main",
data: {
model: model // received from function parameters
}
});
调用主视图(包含SplitContainer)并在onBeforeShow中接收带有提供的事件数据的事件;在主视图中的onBeforeShow函数中,我们使用SplitContainer上的函数toMaster调用主视图,提供相同的事件数据(指定要使用的模型)
onBeforeShow: function(event) { //event contains data.model (verified in debugging)
var container = sap.ui.getCore().byId("my.Main.container");
container.toMaster("my.Master", "show", { model: event.data.model }); //oData parameter
}
调用主视图但在方法onBeforeShow中,事件数据对象不包含属性“model”的先前传递的数据。而且我正在使用onBeforeShow,因为doco明确指出这里你可以找到toMaster()中使用的任何数据。
onBeforeShow: function(event){
// extract the model from the event data...
if( typeof event.data.model !== "undefined") // because event.data.model is not defined, the model is never set :(
this.getView().setModel(new sap.ui.model.json.JSONModel(event.data.model));
},
来自SplitContainer.toMaster documentation, referring to parameter oData
{object} oData自1.7.1版以来。该可选对象可以携带应该可用于目标页面的任何有效载荷数据。目标页面上的“beforeShow”事件将此数据对象包含为“data”属性。
那么它去了哪里,我该如何通过呢?我基本上试图从初始视图,后续视图,然后到最终的主视图(菜单)级联事件数据。任何帮助将不胜感激。
答案 0 :(得分:0)
我构建了一个小型jsBin,用于显示事件的工作原理:http://jsbin.com/zonovuzixi/3/edit?html,css,js,output
<!DOCTYPE html>
<html>
<head>
<script src="https://openui5.hana.ondemand.com/resources/sap-ui-core.js" id="sap-ui-bootstrap" data-sap-ui-theme="sap_bluecrystal" data-sap-ui-libs="sap.m"></script>
<meta charset="utf-8">
<title>JS Bin</title>
<script>
(function () {
"use strict";
var detailPage = new sap.m.Page({
title: "firstDetail",
content: new sap.m.Button({
text: "to page 2",
press: function () {
splitApp.toDetail(secondDetailPage.getId(),"show",{foo :"bar"});
}
})
});
var secondDetailPage = new sap.m.Page({ title: "secondDetail"})
.addEventDelegate({
onBeforeShow: function(evt) {
sap.m.MessageToast.show(evt.data.foo)
}
});
var splitApp = new sap.m.SplitApp({
detailPages: [detailPage, secondDetailPage]
});
splitApp.placeAt("content");
})();
</script>
</head>
<body id="content" class="sapUiBody">
</body>
</html>
我不知道你的&#34;导航&#34;,&#34;到&#34;处理程序是实现的,因为它是自定义的。此外,我不知道您是否将onBeforeShow
的EventDelegate添加到了正确的页面。