PrimeFaces подтверждают, что Диалог не будет отображаться после смены языка - PullRequest
0 голосов
/ 05 марта 2020

У меня есть форма с данными внутри. В одном из столбцов есть кнопка для удаления этой строки. К этой кнопке прикреплено диалоговое окно подтверждения простых лиц.

<h:form id="form" style="text-align: -webkit-center">
            <p:dataTable id="preferenceConfigs" var="preferenceConfig"
                         value="#{preferenceManagementBackingBean.preferenceConfigs}">
                <p:column style="width:6rem; text-align: center">
                    <p:commandButton update=":form"
                                     title="#{msgs['common.delete.userpreference.button']}"
                                     icon="fa fa-trash"
                                     action="#{preferenceManagementBackingBean.invalidatePreferenceConfig(preferenceConfig)}">
                        <p:confirm header="Confirmation" message="#{msgs['common.dialog.preference.config.warning']}"
                                   icon="fa fa-exclamation-circle" escape="false"/>
                    </p:commandButton>
            </p:dataTable>

            <p:confirmDialog global="true" showEffect="fade" hideEffect="fade" style="text-align-last: center">
                <p:commandButton value="#{msgs['common.dialog.confirm.yes']}" type="button"
                                 styleClass="ui-confirmdialog-yes" icon="fa fa-check"/>
                <p:commandButton value="#{msgs['common.dialog.confirm.no']}" type="button"
                                 styleClass="ui-confirmdialog-no" icon="fa fa-times"/>
            </p:confirmDialog>
        </h:form>

Все работает нормально, пока я не изменю язык на странице через commandLink. Они расположены в файле masterLayout над этим файлом:

<h:form id="generalSettingsForm">
                            <ul id="language">
                                <li><h:commandLink
                                        action="#{languageSessionBean.changeLanguage('en')}" value="EN"
                                        class="blgm_lSwitch" id="EN"/></li>
                                <li><h:commandLink
                                        action="#{languageSessionBean.changeLanguage('nl')}" value="NL"
                                        class="blgm_lSwitch" id="NL"/></li>
                                <li><h:commandLink
                                        action="#{languageSessionBean.changeLanguage('fr')}" value="FR"
                                        class="blgm_lSwitch" id="FR"/></li>
                            </ul>
                        </h:form>
    public void changeLanguage(String language) {
        locale = new Locale(language);
        findCurrentFacesContext().getViewRoot().setLocale(locale);
    }

Это обновит страницу и отобразит правильный язык. Однако нажатие кнопки удаления теперь автоматически выполняет действие без каких-либо признаков диалогового окна подтверждения. Только если я открою другой диалог (который присутствует на странице JSF) и вернусь, подтверждение снова будет отображаться ...

Консоль разработчика выдает мне следующую ошибку:

VM1391 components.js.xhtml:13 Uncaught TypeError: Cannot read property 'style' of undefined
    at c.show (VM1391 components.js.xhtml:13)
    at c.showMessage (VM1391 components.js.xhtml:13)
    at Object.confirm (VM1391 components.js.xhtml:1)
    at Object.confirm (VM1390 core.js.xhtml:1)
    at HTMLButtonElement.onclick (preferenceManagement.xhtml:58)

Есть понимание?

Ответы [ 3 ]

0 голосов
/ 06 марта 2020

Кажется, что verifyDialog не очень хорошо работает с обновлением ajax.

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

Простой способ решить эту проблему - установить ajax в false по вашей команде ссылки:

<h:commandLink action="#{languageSessionBean.changeLanguage('fr')}" 
               value="FR" class="blgm_lSwitch" id="FR" ajax="false" />
0 голосов
/ 06 марта 2020

После еще одного поиска в Google, кажется, проблема с Primefaces 6.2 со следующим поведением:

verifyDialog не показывает, ошибка регистрируется на консоли (TypeError: this.jqEl не определено )

Это было исправлено в 6.2.2. Я не могу проверить это сам, так как все второстепенные релизы предназначены только для платных пользователей. В качестве обходного пути я попробую собственный диалог. Вы также можете использовать Primefaces 7.0

Официальный GitHub с репродуктором

0 голосов
/ 05 марта 2020

Не могли бы вы попробовать вывести p:confirmDialog из формы? Как то так:

<p:confirmDialog global="true" showEffect="fade" hideEffect="fade" style="text-align-last: center">
    <p:commandButton value="#{msgs['common.dialog.confirm.yes']}" type="button"
                     styleClass="ui-confirmdialog-yes" icon="fa fa-check"/>
    <p:commandButton value="#{msgs['common.dialog.confirm.no']}" type="button"
                     styleClass="ui-confirmdialog-no" icon="fa fa-times"/>
</p:confirmDialog>

<h:form id="form" style="text-align: -webkit-center">
    <p:dataTable id="preferenceConfigs" var="preferenceConfig"
        value="#{preferenceManagementBackingBean.preferenceConfigs}">
        <p:column style="width:6rem; text-align: center">
            <p:commandButton update=":form" icon="fa fa-trash"
                title="#{msgs['common.delete.userpreference.button']}"
                action="#{preferenceManagementBackingBean.invalidatePreferenceConfig(preferenceConfig)}">
                <p:confirm header="Confirmation" message="#{msgs['common.dialog.preference.config.warning']}"
                           icon="fa fa-exclamation-circle" escape="false"/>
        </p:commandButton>
    </p:dataTable>
</h:form>
...