Повторное использование переменной вне состава - передача переменных в jsf? - PullRequest
1 голос
/ 12 сентября 2011

Я использую 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>

verifyBlockJS, очевидно, пуст в этот момент, что на самом деле является хорошей вещью для меня. Но нет ли способа передать переменную вверх? Я попробовал ui: param без удачи.

РЕШЕНИЕ Используйте ui:decorate, если вы хотите получить доступ к переменной, установленной с помощью c:set вне страницы, которая использует ui:decorate. Это все еще будет видно. В случае ui: include набор c: не будет виден снаружи, но ui: param должен его пропустить (например, используйте ui: param вместо c:set в композиции ui:include)

1 Ответ

2 голосов
/ 12 сентября 2011

Если вы не хотите встроить его в качестве значения атрибута, то <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-кода с помощью Java / JSF / EL таким образом немного пахнет. Неужели невозможно сделать ее простой функцией JS, которую вы помещаете в файл .js и параметризируете ее аргументами?

...