【问题标题】:Reuse variable outside of composition - passing variables up in jsf?在组合之外重用变量 - 在jsf中传递变量?
【发布时间】:2011-09-12 17:15:18
【问题描述】:

我正在使用 jsf 1.2 并且有一些奇怪的 javascript,这些 javascript 在我的项目中的多个地方重复出现。

我不想重复自己......但我发现没有办法做类似的事情:

<ui:composition>
        <c:set var="confirmBlockJS" value="if (confirm('#{tk:encodeJS(confirmMessage)}')) {#{confirmed}} else{ #{notConfirmed}}"/>
</ui:composition>

现在我想使用 set 变量但是 obv 这会失败。

                <ui:include src="/blocks/tech/confirmBlock.xhtml">
                    <ui:param name="confirmMessage" value="#{appTexts['action.logout.title']}"/>
                    <ui:param name="confirmed" value="return false;"/>
                    <ui:param name="notConfirmed" value=" #{doJS}"/>
                </ui:include>
            <h:outputLink id="logout" value="#" rendered="#{renderLogout}"
                onclick='#{confirmBlockJS};'
                styleClass="_allowEnterKey">
                <h:outputText value="#{appTexts['action.logout']}"></h:outputText>
            </h:outputLink>

confirmBlockJS 在这一点上显然是空的,这在我看来实际上是一件好事。但是有没有办法将变量向上传递?我试过 ui:param 没有运气。

解决方案 当您想在使用ui:decorate 的页面之外访问使用c:set 设置的变量时,请使用ui:decorate。它仍然是可见的。在 ui:include 的情况下,c:set 将在外部不可见,但 ui:param 应该传递它(例如,在 ui:include 组合中使用 ui:param 而不是 c:set

【问题讨论】:

    标签: jsf variables facelets visibility dry


    【解决方案1】:

    如果您不想将其作为属性值内联,那么&lt;ui:decorate&gt; 将是您的解决方案。

    一个 EL 函数最接近你可以为这个特定的功能要求工作:

    <h:outputLink id="logout" value="#" rendered="#{renderLogout}"
        onclick="#{js:confirmBlock(appTexts['action.logout.title'], 'return false;', doJS)}"
        styleClass="_allowEnterKey">
        <h:outputText value="#{appTexts['action.logout']}"></h:outputText>
    </h:outputLink>
    

    或:

    <ui:param name="confirmBlock" value="#{js:confirmBlock(appTexts['action.logout.title'], 'return false;', doJS)}" />
    <h:outputLink id="logout" value="#" rendered="#{renderLogout}"
        onclick="#{confirmBlock}"
        styleClass="_allowEnterKey">
        <h:outputText value="#{appTexts['action.logout']}"></h:outputText>
    </h:outputLink>
    

    注意,这种方式通过 Java/JSF/EL 生成 JS 代码有点臭。难道真的不可能把它变成一个简单的 JS 函数,你把它放在一个 .js 文件中并用参数对其进行参数化吗?

    【讨论】:

    • 实际上一个简单的 js 函数可能是最干净的解决方案......问题是传递给函数的文本必须被转义,尤其是带有许多 ' 的法语会给我们带来麻烦。据我所知,如果不使用一些 java 函数 #{tk:encodeJS()},就无法强制执行此操作。其他想法? EL 函数也是一种可能的解决方案。我不太明白的是你的 UI:param 示例......我用它在包含或装饰中传递变量。所以你的第二个例子必须在一个带有一些定义的装饰内?
    • 然后相应地使用#{tk:encodeJS()}?至于&lt;ui:param&gt;的例子,它只是为表达式冗长而你想多次重复使用它的情况创建一个“别名”。
    • 直到今天我才真正理解了 ui:decorate 和 ui:include 之间的区别(例如,至少 c:set 的可见性不同)。我不知道当我用我的积木试试运气时出了什么问题,但基本上它应该可以工作:-)
    猜你喜欢
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多