Локальные (входные) переменные в JSF - PullRequest
0 голосов
/ 13 декабря 2018

Я использую JSF, и у меня возникает следующая проблема:

У меня есть 2 командные кнопки:

<h:commandButton id="btn1" value="Button 1" action="#{bean.action1()}"
   onclick="#{rich:component('confirmation')}.show();" /> 

<h:commandButton id="btn2" value="Button 2" action="#{bean.action2()}"
   onclick="#{rich:component('confirmation')}.show();" /> 

Поэтому, когда они нажимаются, должно отображаться всплывающее окно (с id =«подтверждение»).

Вот всплывающее окно:

<rich:popupPanel id="confirmation" header="Note" modal="true"
            width="525" height="180" resizable="false" headerClass="rf-p-hdr"
            autosized="false">

        <a4j:queue ignoreDupResponses="true" requestDelay="500" />

        <f:facet name="controls">
            <h:panelGroup>
                <a4j:commandButton
                    image="#{resource['default:img/close_button.png']}"
                    styleClass="close_button" action="#{bean.cancel()}"
                    render="@all"
                    oncomplete="#{rich:component('confirmation')}.hide(); return false;"
                    status="ajaxProgress" />
            </h:panelGroup>
        </f:facet>

        <s:div styleClass="help_embedded"
            style="margin-bottom: 20px; margin-top: 20px;">
            <h:outputText value="Here I want to display a message that tells the user which button was pressed." />
        </s:div>

        <s:div style="margin-left: 82px;">

            <s:decorate template="/layout/field.xhtml">

                <a4j:commandButton value="#{messages['allPages.button.save']}"
                    action="#{bean.save()}" execute="@this"
                    oncomplete="#{rich:component('confirmation')}.hide(); return false;"
                    render="@all"
                    status="ajaxProgress" />

                <a4j:commandButton value="#{messages['allPages.button.cancel']}"
                    styleClass="cancel" action="#{bean.cancel()}"
                    execute="@this"
                    oncomplete="#{rich:component('confirmation')}.hide(); return false;"
                    render="@all"
                    status="ajaxProgress" />

            </s:decorate>

        </s:div>


    </rich:popupPanel>

Моя проблема : если вы посмотрите на h: outputText внутри всплывающего окна - Я хочу, чтобы он отображал сообщение пользователю, в зависимости от того, какая кнопка была нажата (btn1 или btn2). Например, , если пользователь нажал btn1 , всплывающее сообщение будет - «Вы только что нажали кнопку 1. Вы уверены, что хотите выполнить это действие?» .И если пользователь нажал кнопку 2 , сообщение будет иметь следующий вид: «Вы только что нажали кнопку 2. Вы действительно хотите выполнить это действие?» .

Я пытался обновлять значение базового компонента при каждом нажатии кнопки, а затем повторно отображать всплывающее окно, но похоже, что тег всплывающего окна генерируется только один раз, когда страница загружается, и повторное отображение ничего не делает.

Мне также хотелось бы решение, в котором все динамические изменения в пользовательском интерфейсе происходят только во внешнем интерфейсе, не мешая серверу перегенерировать страницу - поэтому нажатие кнопки 1 приведет к изменению JavaScriptпеременная внешнего интерфейса и h: outputText во всплывающем окне будут читать это значение для отображения сообщения.

У вас есть идея, как этого достичь?

1 Ответ

0 голосов
/ 13 декабря 2018

Использование «локальных» переменных для выполнения этого в среде, такой как JSF, довольно противоречиво.По моему мнению, вы должны использовать атрибут update в commandButtons, чтобы указать, какой компонент страницы должен быть обновлен после выполнения вашего кода в bean-компоненте, чтобы не нужно было перезагружать всю страницу, а компонент обновлялся с помощьюновая информация.

Взгляните на этот вопрос для подробного объяснения.

...