Отображать динамическое сообщение на p:confirmDialog без отправки запроса на сервер

Мне нужно динамически отображать подтверждающее сообщение на <p:confirmDialog>. Это можно сделать, обновив этот компонент с помощью AJAX после отправки запроса на сервер. Например,

<p:column selectionMode="multiple">
    <f:facet name="footer">
        <p:commandButton oncomplete="confirmDeleteMultiple.show()"
                         update=":form:confirmDialogDeleteMultiple" 
                         process=":form:dataTable"
                         actionListener="#{bean.deleteMultipleActionListener}"/>
    </f:facet>
</p:column>

Указанная кнопка в нижнем колонтитуле <p:dataTable> может обновить сообщение, установленное внутри deleteMultipleActionListener(ActionEvent actionEvent){...}, и обновить указанный диалог подтверждения confirmDialogDeleteMultiple, который выглядит следующим образом.

<p:confirmDialog id="confirmDialogDeleteMultiple"
                 widgetVar="confirmDeleteMultiple"
                 message="#{bean.deleteMultipleMsg}"
                 header="Header Message"
                 appendToBody="true" closable="true">

    <p:commandButton id="confirmDeleteMultiple"
                     value="Yes"
                     process="@this dataTable messages"
                     rendered="#{bean.renderedYesButtonMultipleDelete}" 
                     update="messages dataTable" 
                     oncomplete="confirmDeleteMultiple.hide()"
                     actionListener="#{bean.deleteMultiple}"/>

    <p:commandButton id="declineDeleteMultiple"
                     value="#{bean.noButtonTextMultipleDelete}" 
                     onclick="confirmDeleteMultiple.hide()"
                     type="button"/>
</p:confirmDialog>

Управляемый компонент выглядит следующим образом.

@ManagedBean
@RequestScoped
public final class Bean {
    private String deleteMultipleMsg; //Getter only.
    private boolean renderedYesButtonMultipleDelete=true; //Getter only.
    private String noButtonTextMultipleDelete="No"; //Getter only.

    public void deleteMultipleActionListener(ActionEvent actionEvent) {
        if(selectedValues!=null&&!selectedValues.isEmpty()) {
            renderedYesButtonMultipleDelete=true;
            noButtonTextMultipleDelete="No";
            deleteMultipleMsg="Confirmation message.";
        } else {
            noButtonTextMultipleDelete="Ok";
            renderedYesButtonMultipleDelete=false;
            deleteMultipleMsg="Row selection message.";
        }
    }
}

selectedValues — это список, который содержит выбранные строки в DataTable. deleteMultipleMsg — это сообщение, которое отображается на <p:confirmDialog> после запроса AJAX.


В этом вообще нет вопросов. Это работает, как и ожидалось. Поэтому я не исследую это подробно.

Однако для этого требуется отправить запрос AJAX на сервер только для получения простого сообщения подтверждения. Я чувствую, что это совершенно ненужно. Такое подтверждающее сообщение должно отображаться на самой стороне клиента перед отправкой фактического запроса на сервер.

Итак, я ищу способ сделать это на стороне клиента, возможно, с помощью обычного JavaScript. Можно ли это сделать как обычно, точно так же, как отображается JavaScript confirm("Message") с кнопками Ok и Cancel?

Я использую Primefaces 3.5. Теперь это 4.0 final. Теперь это 5.1 final.


person Tiny    schedule 22.06.2013    source источник


Ответы (2)


Вам может быть достаточно простой функции replaceWith:

<script>
jQuery("confirmDeleteMultiple.p").replaceWith(...

</script> 
person herry    schedule 15.12.2013

Вы можете сохранить сообщение на своей XHTML-странице со стилем CSS display:none и выполнить проверку в JavaScript, а если проверка не пройдена, просто измените стиль на display:block. Нет АЯКС.

person Amit Tikoo    schedule 22.06.2013
comment
Строки, подлежащие удалению, должны подсчитываться в первую очередь на стороне клиента, которая запрашивает у пользователя подтверждение, например Вы собираетесь удалить 5 строк... перед фактическим запросом AJAX на удаление выбранной строки. (с) отправлено. Поэтому я не уверен, как этого добиться с помощью JavaScript. Я использую флажки, чтобы пометить строки для удаления, но на самом деле флажки не отображаются. Они отображаются только с помощью некоторых <div> и тому подобное. - person Tiny; 24.06.2013