如何从外部访问组件模型

时间:2018-12-11 15:22:42

标签: sapui5

我在 index.html 中创建了一个shell-in-shell结构:

sap.ui.getCore().attachInit(function () {
     // create a new Shell that contains the root view
     var oShell = new sap.m.Shell({
         id: "appShell",
         app: new sap.ui.core.ComponentContainer({
             name: "internal_app",
             height: "100%"
         })
    });

    // load the view that contains the unified shell
    var oAppShellView = sap.ui.view({
        type: sap.ui.core.mvc.ViewType.XML,
        viewName: "internal_app.view.AppShell"
    });
    // access the unified shell from the view
    var oUnifiedShell = oAppShellView.byId("unifiedShell");
    // place the app shell in the unified shell
    oUnifiedShell.addContent(oShell);
    oAppShellView.placeAt("content");
});

此外,在manifest.json中定义了一个默认模型:

....
},
"models": {
  "": {
    "type": "sap.ui.model.json.JSONModel"
  }
},
....

在视图internal_app.view.AppShell(由上面的代码段创建)的控制器中,我现在想访问默认模型,但既不能访问this.getModel()也不能访问this.getOwnerComponent().getModel()({{ 1}}和getModel()返回getOwnerComponent())起作用。我假设AppShell控制器没有所有者。但是,如何在该控制器的undefined中访问默认模型?

1 个答案:

答案 0 :(得分:1)

您所用的应用程序结构有点不寻常-尽管您可以访问内部组件,但始终可以访问manifest.json中定义的模型。

假设this引用了internal_app.view.AppShell的控制器,您可以得到如下默认模型:

onInit: function() {
  var innerShell = sap.ui.getCore().byId("appShell"); // only if the app is standalone
  this.componentLoaded(innerShell.getApp()).then(this.onComponentCreated.bind(this));
},

componentLoaded: function(componentContainer) {
  var component = componentContainer.getComponent();
  return component ? Promise.resolve(component) : new Promise(function(resolve) {
    componentContainer.attachEventOnce("componentCreated", function(event) {
      resolve(event.getParameter("component"));
    }, this);
  }.bind(this));
},

onComponentCreated: function(component) {
  var myDefaultModel = component.getModel(); // model from manifest.json
  // ...
}