sapui5 - includeScript 函数包含的外部 JS 库不可访问
问题描述
我尝试在加载 UI5 页面后测试 includeScript 函数以加载外部 js 库。它在脚本加载后的所有情况下都有效,它是可访问的。但是,如果有 ChartContainer 控件,则无法访问加载的 JS 库。
- 工作案例,选择 Map Container 控件的示例页面:https://sapui5.hana.ondemand.com/#/entity/sap.ui.vk.MapContainer/sample/sap.ui.vk.sample.MapContainerBasic,在页面之后加载完毕,打开开发者工具,在控制台面板中运行下面的脚本。
var includeScript = sap.ui.require("sap/ui/dom/includeScript"); try { dateFns.isToday(new Date()); } catch (err) { new Promise(function(fnResolve, fnReject) { includeScript( "https://cdnjs.cloudflare.com/ajax/libs/date-fns/1.30.1/date_fns.min.js", "datefns_js", fnResolve, fnReject); }).then(function() { console.log("datefns_js is loaded!!!") console.log(dateFns.isToday(new Date())); }); }
<script src="https://sapui5.hana.ondemand.com/resources/sap-ui-core.js"></script>
加载 dateFns 后,执行下一个命令:
dateFns.isToday(新日期());
它在控制台中返回 true,因为 dateFns js 已加载并可访问。
- 无工作情况,特别是在测试 ChartContainer 控件时,在新会话中打开图表容器控件的示例页面:https ://sapui5.hana.ondemand.com/#/entity/sap.suite.ui.commons.ChartContainer/sample/ sap.suite.ui.commons.sample.ChartContainerSimpleToolbar 打开开发者工具,重复上述步骤。由于库已加载但无法访问,因此错误发生为“未捕获的 ReferenceError:未定义 dateFns”。
我希望加载的外部 js 库应该可以通过我的 UI 中的任何控件访问。
解决方案
可以加载使用统一模块定义 (UMD) 语法的模块,但仅当不存在 AMD 加载器或它们将其导出也暴露给全局命名空间时,即使存在 AMD 加载器也是如此
不幸的是,SAPUI5 图表使用另一个 AMD 加载器 ( RequireJS
),因此您的模块将使用 RequireJS 加载,并且对全局对象date-fns
不可用。window
要解决此问题,您可以强制模块始终通过 RequireJS 加载,然后通过以下require
方法可用:
<script src="https://sapui5.hana.ondemand.com/resources/sap-ui-core.js"></script>
<script>
var declareLibs = new Promise(function (resolve, reject) {
sap.ui.require(["sap/ui/thirdparty/require"], function () {
requirejs.config({
paths: {
"date_fns": ["//cdnjs.cloudflare.com/ajax/libs/date-fns/1.30.1/date_fns.min"]
}
});
resolve();
});
});
declareLibs.then(require(["date_fns"], function (dateFns) {
console.log("datefns_js is loaded!")
console.log(dateFns.isToday(new Date()));
}));
</script>
推荐阅读
- c# - 任何人都可以用 c# 求解 x 吗?地板(x * 1.04)= 258
- next.js - NextJS Routing 在确定路由时考虑 / 和 %2F
- javascript - 带有 telegraf.js 的 Telegram 机器人:无法使用 flickr api 发送随机照片进行聊天
- php - 将变量传递给php websocket
- opengl - 如何使用 GL_TRIANGLE_STRIP 绘制矩形框?
- java - 测试不使用 Spring WebFlux & Reactive MongoDB 运行
- sql-server - SQL Server 忽略 UNION 的索引
- python - 策略创建的 Alice blue api 模块问题
- ethereum - Solidity 智能合约部署期间的错误:未捕获的错误:已调用回调
- javascript - 为什么我的 if 语句忽略了布尔“真”值条件?