使用组件容器在多个应用程序中重用应用程序

时间:2019-03-27 10:28:17

标签: sapui5

在特定情况下,未加载我在组件容器中引用的应用程序。知道我做错了什么或可以解决我的问题吗?

这些是我为解决问题而采取的步骤:

步骤1:在工作清单中打开弹出窗口 enter image description here

第2步:在工作清单中按“ a”导航到详细信息,然后打开详细信息中的弹出框 enter image description here

第3步:按左上角的“后退箭头”(参见上图)导航到工作清单,然后再次打开工作清单中的弹出式窗口。 enter image description here

我有3个应用程序:worklist-app,detail-app,popover-app。

使用组件容器将popover应用程序包含在我的工作列表和详细信息应用程序中(工作列表和详细信息应用程序中弹出窗口的ID不同)

<core:FragmentDefinition xmlns="sap.m" xmlns:core="sap.ui.core">
    <ResponsivePopover afterClose="destroyPopover" class="sapUiPopupWithPadding" id="popover--id1" placement="Left">
        <content>
            <core:ComponentContainer name="name.space.app" component="appname" propagateModel="true">
            </core:ComponentContainer>
        </content>
    </ResponsivePopover>
</core:FragmentDefinition>

在我的工作清单应用程序和详细信息应用程序的Component.js中,我使用以下方式注册了我的popover应用程序:

jQuery.sap.registerModulePath("name.space.app", "/sap/bc/ui5_ui5/sap/appname");

在我的worklist-app和detail-app的onExit方法中,我销毁了弹出窗口以防止重复ID错误。

当我在工作列表中打开弹出窗口时,弹出窗口会正确打开。 当我在detail-app中打开弹出窗口时,弹出窗口会正确打开。

当我进入detail-app时,单击左上角的“后退箭头”,

enter image description here

**我导航回到工作清单。如果那样的话,我想打开弹出窗口,则打开弹出窗口,但是里面什么也没显示。**

我希望弹出窗口与步骤1一样可见。

打开弹出窗口的代码:

if (!this._oPopover) {
            this._oPopover = sap.ui.xmlfragment("name.space.popover", this);
            this.getView().addDependent(this._oPopover);
            this._oPopover.setBusy(true);
}

this._oPopover.openBy(oEvent.getSource());

关闭弹出窗口的代码:

if(this._oPopover) {
   this._oPopover.destroy();
}

我没有收到任何错误,所以我不知道如何调试实际发生的情况。

我注意到我进入了我的popover应用程序的App.controller,但是在那之后他没有输入我的popover视图中指定的Controller的onInit()。

有人遇到过同样的问题,或者有人知道是什么原因导致了这种行为,或者我可以采取什么措施来解决我的问题?

预先感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

我过去也遇到过类似的问题,并通过将onInit代码移动到默认路由方法的onRouteMatched函数来解决了该问题。这对我有用。

...
     onInit: function () {

            this.getRouter().getRoute("home").attachPatternMatched(this._onRouteMatched, this);


        },


        _onRouteMatched: function (oEvent) {
          //PUT your code here
        },

答案 1 :(得分:0)

第一次单击可以正常工作,但是第二次单击!this._oPopover为假,您尝试打开无效/已破坏的片段。

if (!this._oPopover) {
   //entered only on first click,
   //even after leaving app to a launchpad and navigating back in the app
   this._oPopover = sap.ui.xmlfragment("name.space.popover", this);
   this.getView().addDependent(this._oPopover);
   this._oPopover.setBusy(true);
}

this._oPopover.openBy(oEvent.getSource());

关闭弹出窗口的代码:

if(this._oPopover) {
   this._oPopover.destroy();
   //Popover fragment is destroyed, but this._oPopover still holds an object
   //reset also variable here
  this._oPopover = undefined;
}

通常,您不必销毁片段,只需将其关闭然后再次重新打开,因为您可以将其保存在this._oPopover中,这样就不会在每次单击时都重新初始化它。

在打开弹出窗口的控制器的onInit()中将this._oPopover声明为初始/未定义,以确保在初始化视图时该片段也被初始化。

编辑有关您的评论:

通常,一个片段没有生命周期方法,并且在一种the following设计模式中被标记为Singleton

如果您将自己的整个应用包裹在弹出式片段中(这是我的理解),那么当您仅引用一个片段而不使用视图和导航时,我不确定在您的情况下如何处理生命周期方法。在视图中,始终仅在 re-rendering 上调用onBeforeRendering(),而不是只调用一次的onInit(),请参阅this blog post

尽管如此,this._oPopover = undefined;销毁片段时应该解决您的非最佳实践方法吗?

答案 2 :(得分:0)

所以我弄清楚了为什么不再加载该应用程序。在工作清单(执行向后导航的端点)中,我实现了一个appstate以便存储先前设置的过滤器。

appstate是通过URL中的密钥存储的,因为有了该密钥,manifest一旦尝试打开,就无法映射弹出应用程序目标。

我已经通过调整弹出式应用程序清单中的路由来解决此问题:

"routes": [
    {
        "pattern": ":?query:",
        "name": "popoverapp",
        "target": [
                "popoverapp"
        ]
    }
],