Liferay 7.0 中的 Arcgis 冲突
Arcgis conflict in Liferay 7.0
我尝试在 Liferay 7.0 中使用 Arcgis javascript API 但失败了。我认为是因为 Liferay 7.0 使用 requireJS 来使用 javascript,这与 Arcgis javascript API 的 dojo 冲突。我正在使用此代码来实现 Arcgis API:
<script type="text/javascript" src="<%=request.getContextPath() %>/js/arcgis_js_api/library/3.14/3.14/init.js"></script>
<script>
require([
"esri/map", "dojo/dom"
], function(Map, dom) {
var map = new esri.Map("map", {
basemap: "topo", //For full list of pre-defined basemaps, navigate to http://arcg.is/1JVo6Wd
center: [-122.45, 37.75], // longitude, latitude
zoom: 13
});
});
这是控制台日志:
java.lang.IllegalArgumentException: Path esri/map.js does not start with a "/" character
java.lang.IllegalArgumentException: Path dojo.js does not start with a "/" character
这是 javascript 错误:
Error: defineAlreadyDefined
谁有解决办法请帮帮我。谢谢!
正如您提到的 Liferay7 和您的脚本标记使用 <%=request.getContextPath()%>
,您的 portlet 和 servlet 之间很可能不匹配 API:request
不知道任何portlet 上下文(但仍然存在,因为 JSP 是为 servlet 设计的,它是一个强制性的对象,激怒了很多人)
您自己的 Javascript 文件的 URL 与上下文根无关,但 Liferay 使它们在不同的路径上可用。最简单的方法是只提及您想要包含在 portlet 的配置中的文件,而不用弄乱这个位置。在 Liferay 7 OSGi portlet 模块中,它是这样工作的(伪代码,简化)
@Component(
immediate = true,
property = {
"com.liferay.portlet.footer-portlet-javascript=/js/main.js",
"javax.portlet.display-name=My Portlet",
},
service = Portlet.class
)
在 WAR 中打包的 JSR-286 portlet 中,您将使用 WEB-INF/liferay-portlet.xml.
中的 footer-portlet-javascript 值
或者,使用 header-*
变体。
我个人更喜欢这种方式,而不是记住资源路径是如何构建的。
我在实施 arcgis 之前使用此代码 (javascript):
if(typeof define !== "undefined" && typeof require !== "undefined"){
window.__define = window.define;
window.__require = window.require;
window.define = undefined;
window.require = undefined;}
会解决的
我尝试在 Liferay 7.0 中使用 Arcgis javascript API 但失败了。我认为是因为 Liferay 7.0 使用 requireJS 来使用 javascript,这与 Arcgis javascript API 的 dojo 冲突。我正在使用此代码来实现 Arcgis API:
<script type="text/javascript" src="<%=request.getContextPath() %>/js/arcgis_js_api/library/3.14/3.14/init.js"></script>
<script>
require([
"esri/map", "dojo/dom"
], function(Map, dom) {
var map = new esri.Map("map", {
basemap: "topo", //For full list of pre-defined basemaps, navigate to http://arcg.is/1JVo6Wd
center: [-122.45, 37.75], // longitude, latitude
zoom: 13
});
});
这是控制台日志:
java.lang.IllegalArgumentException: Path esri/map.js does not start with a "/" character
java.lang.IllegalArgumentException: Path dojo.js does not start with a "/" character
这是 javascript 错误:
Error: defineAlreadyDefined
谁有解决办法请帮帮我。谢谢!
正如您提到的 Liferay7 和您的脚本标记使用 <%=request.getContextPath()%>
,您的 portlet 和 servlet 之间很可能不匹配 API:request
不知道任何portlet 上下文(但仍然存在,因为 JSP 是为 servlet 设计的,它是一个强制性的对象,激怒了很多人)
您自己的 Javascript 文件的 URL 与上下文根无关,但 Liferay 使它们在不同的路径上可用。最简单的方法是只提及您想要包含在 portlet 的配置中的文件,而不用弄乱这个位置。在 Liferay 7 OSGi portlet 模块中,它是这样工作的(伪代码,简化)
@Component(
immediate = true,
property = {
"com.liferay.portlet.footer-portlet-javascript=/js/main.js",
"javax.portlet.display-name=My Portlet",
},
service = Portlet.class
)
在 WAR 中打包的 JSR-286 portlet 中,您将使用 WEB-INF/liferay-portlet.xml.
中的 footer-portlet-javascript 值或者,使用 header-*
变体。
我个人更喜欢这种方式,而不是记住资源路径是如何构建的。
我在实施 arcgis 之前使用此代码 (javascript):
if(typeof define !== "undefined" && typeof require !== "undefined"){
window.__define = window.define;
window.__require = window.require;
window.define = undefined;
window.require = undefined;}
会解决的