【问题标题】:Liferay Faces and remote javascript inside headLiferay Faces 和头部内部的远程 javascript
【发布时间】:2019-01-05 12:40:11
【问题描述】:

我正在使用 Primefaces 6.0 和 Liferay 6.2.5 tomcat 包开发 Liferay Primefaces portlet。我使用的是 Liferay Faces 的旧版本控制方案。

然后我决定切换到当前版本,如 6.2、2.2、primefaces 和 maven 所见 here

我的问题是我有一些使用 primefaces gmap 组件的 portlet,所以我需要包含 google maps javascript,我用以下代码做到了:

    <h:head>
        <script
            src="https://maps.google.com/maps/api/js?key=MY_KEY"
            type="text/javascript" />
    </h:head>

虽然这在之前完美运行,但在我升级后它就不起作用了。事实上,我不能使用上面的代码包含任何脚本。在 head 标签中包含远程 javascript 的任何帮助/解决方法?

【问题讨论】:

    标签: liferay-6 jsf-2.2


    【解决方案1】:

    编辑:FACES-2974 已在 Bridge Impl 4.1.0 中修复。

    这是 Liferay Faces Bridge 中的 regression bug (FACES-2974) 4.0.0(以及 3.0.02.0.0)。

    要解决此问题,您可以创建一个具有name 属性的复合组件。该名称必须以“css”或“js”结尾,并且每个视图应该是唯一的,以确保始终加载它。例如,创建以下 resources/workaround/headElements.xhtml 文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <ui:component xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
        xmlns:cc="http://xmlns.jcp.org/jsf/composite" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.w3.org/1999/xhtml http://www.w3.org/2002/08/xhtml/xhtml1-transitional.xsd">
    
        <!-- Workaround for https://issues.liferay.com/browse/FACES-2974 -->
        <cc:interface>
            <cc:attribute name="name" required="true" />
        </cc:interface>
    
        <cc:implementation>
            <cc:insertChildren />
        </cc:implementation>
    
    </ui:component>
    

    将此组件与上述谷歌地图脚本一起使用:

    <h:head>
        <workaround:headElements name="#{view.viewId}.js">
            <script src="https://maps.google.com/maps/api/js?key=MY_KEY"
            type="text/javascript" /></script>
        </workaround:headElements>
        <!-- ... -->
    </h:head>
    

    【讨论】:

    • 很酷的解决方法,感谢您的帮助。编辑:使用此解决方法,如果我添加两个包含上述代码的 portlet,桥是否仍不会多次加载脚本? (我知道 gmap 只能单独使用,只是出于好奇)
    • 我认为它仍然会删除脚本 (thanks to these lines of HeadResource)。您可以尝试一下并报告吗?
    • 您好,很抱歉回复晚了。解决方法确实正确地将脚本放置在头部中,并且在 portlet 的多个实例的情况下不超过一次。此外,即使您很明显应该将组件放置在 h:head 元素内,我认为您应该在回答中明确说明。
    • @ΟδυσσέαςΔούμας,已编辑,谢谢!你能支持我的回答吗?
    猜你喜欢
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 2013-09-17
    相关资源
    最近更新 更多