sapui5 - Fiori 启动板:使用没有 `attachLogoutEvent` 的自定义后端调用处理注销事件(UI5 < 1.81)
问题描述
所以,我发现启动板容器 API 提供了一个选项来注册注销事件并返回一个承诺(https://ui5.sap.com/#/api/sap.ushell.services.Container%23methods/attachLogoutEvent)。不幸的是,在实现之后我发现 UI5 版本必须是 1.81 或更高的参数bAsync
才能工作。在我的项目中,我们处于 1.78,所以对我没有任何承诺。
有什么问题?
我想在所述注销事件中进行后端调用。这不起作用,因为据我了解我的调试,启动板会在我的注销事件“完成”之后销毁所有内容(= 事件中的每一行代码都已完成,忽略子功能)。超时等不起作用,因为它们的调用也将在代码进度已经完成之后,这意味着调用被删除。
我尝试了什么?
- 没有子功能的即时后端调用→由于与上述相同的原因而无法正常工作。
- 无限循环直到处理后端调用→堆栈溢出。
- While-looping with timeout/await → await not allowed in strict mode, 由于上述问题,超时不起作用。
我认为什么可能有效?
- 停止代码进度,直到后端调用完成。
- 使用完全不同的方法让我的逻辑处理注销(例如完全自定义注销)。
- 在这里询问更多的想法。
有谁知道如何解决 UI5 1.78的问题?
解决方案
好吧,我已经找到了解决方案。它可能不是技术上最好的,但它可以工作并且结果看起来足够干净。这是来自 S4/HANA 系统,所以它可能不是一个通用的解决方案(例如,它不考虑在我的启动板中不存在的左侧窗格中注销)。
我做了什么?
我没有将我的个人逻辑附加到 Fiori 注销事件,而是使用我的个人逻辑创建了一个自定义注销按钮,然后调用 SICF 注销节点。
我是怎么做到的?
- 创建启动板插件
- 在
Component.js
中,添加一个具有自定义注销功能的新标题项// ushellLib required from "sap/ushell/library" var oRenderer = ushellLib.Container.getRenderer("fiori2"); oRenderer.addHeaderEndItem("sap.ushell.ui.shell.ShellHeadItem", { id: "logoutButton", icon: "sap-icon://log", // ... press: [this._logout, this], }, true, false);
_logout: function() { this._callMyStuff(); window.location.href = "/sap/public/bc/icf/logoff"; },
- 在中,隐藏桌面 ( ) 和移动 ( )
style.css
中的原始注销按钮 (logoutBtn),以防止通过默认注销注销来跳过我的逻辑。__list0...
__list1...
#__list0-7-logoutBtn { display: none; } #__list1-7-logoutBtn { display: none; }
推荐阅读
- python - 我在 heroku 上运行的 discord.py 机器人不断停止
- angular - 是否可以将 Angular Service Worker 设置为在同一域中的不同路由上禁用?
- ios - SwiftUI Lists + Firebase Firestore,获取数据然后取消获取?(漏洞)
- c# - C# 返回登录用户的数据
- pandas - 如何将 for 循环的结果转换为 pandas 数据框?
- javascript - 将 javascript 数组传递给 canvasjs(图表)脚本
- arduino - 将 Arduino MKR NBIoT 1500 板连接并添加到云服务器
- javascript - 如何检查未插入表中的重复值?
- node.js - 在 node.js 中构建 hmac sha256 哈希算法
- python - Fortran DMOD 与 Python numpy.remainder