Автообновление Primefaces работает только один раз - PullRequest
0 голосов
/ 10 марта 2020

У меня есть страница с различными вычислениями, которые выполняются ajax. В конце страницы должен быть текст подсказки, который обновляется после каждого вычисления.

Для этого я использую функцию autoUpdate Primefaces.

Когда я загружаю страницу изначально текст отображается правильно. Также после первого расчета текст обновляется корректно. Но если я сделаю дальнейшие вычисления, текст больше не будет изменен, независимо от того, какое значение balanceController.getBalance() вернется. Когда я отлаживаю свой код, я вижу, что balanceController.getDetails() работает правильно, а также возвращает нужный текст. Только содержание на моей странице не обновляется. Когда я вручную перезагружаю страницу (с помощью браузера), появляется правильный текст.

В чем может быть причина того, что <p:autoUpdate/> выполняется только во время первого вычисления и обновляет содержимое вкладки?

balancePage.x html

<p:tab title="Further details" rendered="#{balanceController.showDetails()}">
    <p:autoUpdate/>

    <h:outputText value="#{balanceController.details}"/>
</p:tab>

BalanceController. java

public String getDetails() {
    if ( getBalance() >= 0 ) {
        return "Your current balance is: " + Double.toString(getBalance());
    } else {
        return "Your credit has been used up!";
    }
}

1 Ответ

6 голосов
/ 10 марта 2020

В общем случае p:tab не может быть обновлено, поскольку тот, кто отображает p:tab, является родительским компонентом. Вероятно, p:accordionPanel или p:tabView.

Поэтому можно либо переместить p:autoUpdate в родительский компонент, либо переместить его внутрь h:outputText.

ПРИМЕЧАНИЕ: вам, вероятно, нужно добавить идентификатор к h:outputText, так как только компоненты с отображаемым id являются обновляемыми и h:outputText scipts отображает атрибут id, если атрибут id не установлен явно.

Его также можно решить, обернув его p:outputPanel:

<p:tab title="Further details" rendered="#{balanceController.showDetails()}">
    <p:outputPanel>
       <p:autoUpdate/>
       #{balanceController.details}
    </p:outputPanel>
</p:tab>

Я удалил h:outputText по соображениям производительности. ИМО не следует использовать h:outputText для простого текста (escape не установлен на false), так как это создает UICompoment на стороне сервера, что не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...