在组合之外重用变量 - 在jsf中传递变量?

时间:2011-09-12 17:15:19

标签: jsf variables facelets visibility dry

我正在使用jsf 1.2并且有一些奇怪的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应该将它传递出去(例如在c:set组合中使用ui:param而不是ui:include

1 个答案:

答案 0 :(得分:2)

如果您不想将其内联为属性值,那么<ui:decorate>将是您的解决方案。

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>

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