重用组件:旧控制器仍然存在?

2020-08-15 12:01发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好

我在另一个应用程序中嵌入了一个重用组件。

我使用基于组件的路由。 我们的UI5版本是1.71。

在父组件中按下按钮时,它将发布一个事件,子组件将对其进行处理。

EventBus用于此目的。

浏览刷新后首次执行该应用程序时,此操作成功。

但是,当我返回启动板并再次进入应用程序时,多个子控制器会收到相同的事件。

似乎旧控制器仍然存在并对事件做出反应。

到目前为止,我所做的是:

1。 取消订阅儿童控制器的onExit钩子中的事件

2。 在孩子的Component.js中,实现了destroy函数

 destroy:function(){
     UIComponent.prototype.destroy.apply(this,arguments);
 } 

作为一种解决方法,我检查了控制器是否是第一次执行。

但是我想在每次关闭应用程序时销毁子组件。

我该如何实现?

最诚挚的问候,

宇达电通

(22.6 kB)

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好

我在另一个应用程序中嵌入了一个重用组件。

我使用基于组件的路由。 我们的UI5版本是1.71。

在父组件中按下按钮时,它将发布一个事件,子组件将对其进行处理。

EventBus用于此目的。

浏览刷新后首次执行该应用程序时,此操作成功。

但是,当我返回启动板并再次进入应用程序时,多个子控制器会收到相同的事件。

似乎旧控制器仍然存在并对事件做出反应。

到目前为止,我所做的是:

1。 取消订阅儿童控制器的onExit钩子中的事件

2。 在孩子的Component.js中,实现了destroy函数

 destroy:function(){
     UIComponent.prototype.destroy.apply(this,arguments);
 } 

作为一种解决方法,我检查了控制器是否是第一次执行。

但是我想在每次关闭应用程序时销毁子组件。

我该如何实现?

最诚挚的问候,

宇达电通

(22.6 kB)
付费偷看设置
发送
4条回答
路亽曱_Ryan
1楼 · 2020-08-15 12:27.采纳回答

Mio嗨,

很高兴看到您已经在应用程序中使用带前缀的" Component"类型目标! 还要感谢您确认一旦父组件被破坏,嵌套组件也将被破坏。

发生此问题是因为UI5不会取消已附加到全局EventBus对象的事件处理程序的注销。 一种快速的解决方案是在已经覆盖的嵌套组件的destroy函数中执行此操作:

 destroy:function(){
     UIComponent.prototype.destroy.apply(this,arguments); 
//您可以在此处从事件总线注销事件处理程序 }

这应该已经解决了您当前面临的问题。 但是我想给您一些其他想法,以避免在另一个答案中使用EventBus,因为我现在没有时间编写它,并且希望尽快为您提供当前的解决方案。

最诚挚的问候,

Jiawei

Bunny_CDM
2楼-- · 2020-08-15 12:29

Hi Jiawei,

谢谢您的建议。 该问题已通过以下方式解决。

首先,我将用于订阅父项事件的代码从控制器移动到Component.js,以便可以在Component的destroy方法中注销该事件。

元数据:{
 清单:" json",
 事件:{
 parentEvent:{
 参数:{
 数据:{类型:"对象"}
 }
 }
 }
 },

 初始化:函数(){
//...

//订阅家长的活动
 this._oEventBus = sap.ui.getCore()。getEventBus(); //全球
 this._oEventBus.subscribe("父母对孩子","通知",this.oHandleEvent,此);
 },

 oHandleEvent:函数(oData){
                        //通知控制器
 this.fireParentEvent({
 数据:oData
 });
 },

 destroy:function(){
//取消订阅父母的活动
 this._oEventBus.unsubscribe("父母对孩子","通知",this.oHandleEvent,此);
 UIComponent.prototype.destroy.apply(this,arguments);
 }
 

在控制器中,我注册了Component事件的处理程序。

这样,控制器就不必担心注销。

 onInit:函数(){
 this.getOwnerComponent()。attachParentEvent(this.oHandleEvent.bind(this));
 this._randomNumber = Math.floor(Math.random()* 100);
 },

 oHandleEvent:函数(oEvent){
 MessageToast.show("事件已收到编号:" + this._randomNumber);
 },
 

我使用EventBus实现了父子之间的交互式事件交换。

除了使用EventBus(也许在您的Blog帖子中或其他地方?)之外,我想了解其他方法。

无论如何,非常感谢您对这个问题的支持。

最诚挚的问候,

Mio

梦想连接
3楼-- · 2020-08-15 12:25

嗨Mio,

一旦根组件被销毁,

路由器在根组件中加载的所有嵌套组件实例都应被销毁。 在您的情况下,似乎出了点问题,并且没有由根组件的路由器管理嵌套的组件。

您是否在根组件的路由配置中定义了"组件"类型目标,以便通过在根组件中进行路由来加载它? 您可以在此处粘贴有关路由和目标定义的路由配置吗?

最诚挚的问候,

嘉威

hongfeng1314
4楼-- · 2020-08-15 12:28

作为补充:

关闭父应用程序时,将调用智利组件的destroy方法。

但是控制器仍然存在...

一周热门 更多>