在特定情况下,未加载我在组件容器中引用的应用程序。知道我做错了什么或可以解决我的问题吗?
这些是我为解决问题而采取的步骤:
第2步:在工作清单中按“ a”导航到详细信息,然后打开详细信息中的弹出框
第3步:按左上角的“后退箭头”(参见上图)导航到工作清单,然后再次打开工作清单中的弹出式窗口。
我有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时,单击左上角的“后退箭头”,
**我导航回到工作清单。如果那样的话,我想打开弹出窗口,则打开弹出窗口,但是里面什么也没显示。**
我希望弹出窗口与步骤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()。
有人遇到过同样的问题,或者有人知道是什么原因导致了这种行为,或者我可以采取什么措施来解决我的问题?
预先感谢您的帮助!
答案 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"
]
}
],