我尝试测试includeScript函数,以在加载UI5页面后加载外部js库。它在所有情况下均有效,这意味着在脚本加载后即可访问。但是,如果具有ChartContainer控件,则无法访问已加载的JS库。
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,请执行下一条命令:
StdConverter
由于dateFns js已加载并可以访问,因此它在控制台中返回true。
我希望加载的外部js库应该可以通过用户界面中的任何控件进行访问。
答案 0 :(得分:0)
可以加载使用统一模块定义(UMD)语法的模块,但是仅当不存在AMD加载器时,或者即使存在AMD加载器时,它们也将其导出也暴露给全局命名空间时,才可以加载
不幸的是,SAPUI5图表使用另一个AMD加载器(RequireJS
),因此您的模块date-fns
将使用RequireJS加载,而全局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>