ui5 SplitContainer不将事件数据传递给子元素中的onBeforeShow

时间:2015-01-13 22:55:08

标签: javascript javascript-events sapui5

我正在编写一个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”属性。

那么它去了哪里,我该如何通过呢?我基本上试图从初始视图,后续视图,然后到最终的主视图(菜单)级联事件数据。任何帮助将不胜感激。

1 个答案:

答案 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添加到了正确的页面。