P: сообщения отображаются, но почти мгновенно исчезают

у меня странная проблема с тегом p:message. На странице есть таблица данных с данными из моей базы данных, которую я могу редактировать в диалоговом окне p:. После успешного завершения всех проверок и завершения обновления в базе данных я обновляю таблицу данных и добавляю информацию о сообщениях лиц, чтобы отобразить успех операции. В интерфейсе я обновляю форму, которая содержит как таблицу данных, так и диалог. Моя проблема в том, что сообщение отображается, но почти мгновенно исчезает. Как будто тег сообщения обновляется вместе с формой. Я не понимаю.

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

<p:messages autoUpdate = "true" showDetail = "true" severity = "info,error" />
<h:form id = "form">
    <p:dataTable
    style = "width: 80%; margin-left: auto; margin-right: auto; text-align:center"
        var = "achievement" value = "#{achievementBean.listAchievement}">
    ...
    </p:dataTable>

    <p:dialog header = "#{i18n['achievement']}" widgetVar = "dlg"
        dynamic = "true" closable = "false" resizable = "false" showEffect = "fade"
        hideEffect = "fade">
        <h:panelGroup id = "achievementDetail">
            <p:messages autoUpdate = "true" severity = "warn" />
            ...
            <h:panelGrid columns = "2" style = "width: 100%; text-align:center">
                <p:commandButton value = "#{i18n['general.submit']}"
                    icon = "fa fa-check"
                    actionListener = "#{achievementBean.submitAchievement}"
                    oncomplete = "if (!args.validationFailed){updateForm();}" />
                <p:commandButton value = "#{i18n['general.cancel']}"
                    icon = "fa fa-close" action = "#{achievementBean.submitCancel}"
                    oncomplete = "PF('dlg').hide();" update = "@form" process = "@this" />
            </h:panelGrid>
            <p:remoteCommand name = "updateForm" update = "@form" />
        </h:panelGroup>
    </p:dialog>
</h:form>

Я почти уверен, что это потому, что у вас есть автоматическое обновление = «истина» в ваших сообщениях. Если вы посмотрите сетевой трафик с помощью F12, вы его увидите.

Melloware 27.05.2019 18:55

Поскольку OP узнает, создавая минимальный воспроизводимый пример, удаляя все больше и больше из своего кода, и в emd, замечая удаление того, что вы упомянули, это заставляет его работать. Опять минимальный воспроизводимый пример на помощь

Kukeltje 28.05.2019 00:06
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
2
101
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Спасибо за ваши ответы. Извините за mre, я всегда забываю об этом. В следующий раз постараюсь не забыть. Наконец-то мне удалось решить мою проблему.

  • Я добавил идентификатор к первому <p:message>
  • Я добавил обновление этого идентификатора в отправку <p:commandButton>
Ответ принят как подходящий

Ваша конкретная проблема сводится к следующему:

<p:messages autoUpdate = "true" />

<h:form>
    <p:dataTable ...>
       ...
    </p:dataTable>
    ...
    <p:dialog>
        ...
        <p:commandButton
            action = "#{achievementBean.submitAchievement}"
            oncomplete = "if (!args.validationFailed){updateForm();}" />
        <p:remoteCommand name = "updateForm" update = "@form" />
    </p:dialog>
</h:form>
  • autoUpdate = "true" будет автоматически обновлять компонент при каждом запросе ajax.
  • <p:commandButton> вызывает запрос ajax, который добавляет сообщение и вызывает удаленную команду updateForm(). Сообщение отображается в этом запросе ajax.
  • <p:remoteCommand> вызывает другой запрос ajax. Но этот не добавляет никаких сообщений, поэтому в этом запросе ajax ничего не отображается. В результате сообщение, отображаемое в предыдущем запросе ajax, удаляется.

Вы можете использовать атрибут ignoreAutoUpdate компонента команды, чтобы он мог игнорировать любой компонент с возможностью autoUpdate. Итак, ваше решение:

<p:remoteCommand name = "updateForm" update = "@form" ignoreAutoUpdate = "true" />

Тем не менее, почему у вас все еще есть и <p:dialog>, и <p:dataTable> в одном и том же <h:form>? Похоже, вы не приняли или не поняли рекомендацию, содержащуюся в моем ответе на ваш предыдущий вопрос p:commandButton не отображает p:dialog. В нем я рекомендовал вынести <p:dialog> за пределы <h:form> и дать ему собственное <h:form>. Это значительно упрощает управление этими вещами.

Вы должны всегда дать <p:dialog> свой собственный <h:form>.

<p:messages autoUpdate = "true" />

<h:form>
    <p:dataTable ...>
       ...
    </p:dataTable>
    <p:remoteCommand name = "updateForm" update = "@form" ignoreAutoUpdate = "true" />
</h:form>

<p:dialog widgetVar = "dlg">
    <h:form>
        ...
        <p:commandButton
            action = "#{achievementBean.submitAchievement}"
            update = "@form"
            oncomplete = "if (!args.validationFailed){PF('dlg').hide();updateForm();}" />
    </h:form>
</p:dialog>

Смотрите также:

Спасибо за ваш ответ, я лучше понимаю, почему это не сработало. Чтобы ответить на ваш вопрос о единой форме, это потому, что этот код старше, чем вопрос, который я задал. Не забыл вашу рекомендацию по поводу формы и диалогов ;-).

K.Sorokin 29.05.2019 14:34

Другие вопросы по теме