Fiori Elements跳转Launchpad后Socket未关闭仍弹弹窗如何解决?
问题根源
你遇到的现象本质是Fiori Elements应用切换到Launchpad时,sap/ui/core/ws/WebSocket实例没有被主动销毁,关联的消息接收回调也没有解绑,所以连接存活状态下收到后端推送的消息时,仍然会执行弹窗逻辑,最终出现在Launchpad页面上。
解决方案
方案1:在应用Component生命周期内管理WebSocket(推荐)
将WebSocket实例的初始化和销毁逻辑绑定到应用Component的生命周期钩子,用户离开应用时自动销毁连接:
- 把WebSocket实例挂载到Component实例上,方便生命周期钩子访问
- 在Component的
init钩子中初始化WebSocket、绑定消息监听 - 在Component的
exit钩子中解绑监听、关闭WebSocket连接
sap.ui.define([ "sap/suite/ui/generic/template/lib/AppComponent", "sap/ui/core/ws/WebSocket" ], function(AppComponent, WebSocket) { "use strict"; return AppComponent.extend("你的应用命名空间.Component", { metadata: { manifest: "json" }, init: function() { AppComponent.prototype.init.apply(this, arguments); // 初始化WebSocket this._oWebSocket = new WebSocket("你的WebSocket服务地址"); this._oWebSocket.attachMessage(this._handleSocketMessage, this); }, _handleSocketMessage: function(oEvent) { // 原有的弹窗逻辑 }, exit: function() { AppComponent.prototype.exit.apply(this, arguments); // 销毁WebSocket if (this._oWebSocket) { // 先解绑消息监听 this._oWebSocket.detachMessage(this._handleSocketMessage, this); // 连接处于开启状态则主动关闭 if (this._oWebSocket.getReadyState() === WebSocket.OPEN) { this._oWebSocket.close(); } this._oWebSocket = null; } } }); });
方案2:页面控制器内初始化的处理
如果WebSocket是在具体页面的Controller中初始化的,只需要把销毁逻辑放到页面的onExit钩子中即可,逻辑和上面Component的销毁逻辑一致。
方案3:兜底校验逻辑
如果需要兼容特殊场景下销毁逻辑未触发的情况,可以在弹窗执行前增加应用激活状态校验,非当前应用激活状态下不弹出提示:
_handleSocketMessage: async function(oEvent) { // 校验当前应用是否处于激活状态 const oShellNav = await sap.ushell.Container.getServiceAsync("ShellNavigation"); const sCurrentHash = oShellNav.getCurrentNavigationState().hash; // 判断当前hash是否属于你的应用,不符合则直接返回不弹窗 if (!sCurrentHash.startsWith("#你的应用语义对象-")) { return; } // 原有弹窗逻辑 }
内容的提问来源于stack exchange,提问作者Y15
相关产品推荐
相关产品推荐

