Компонент Primefaces не обновляется - PullRequest
1 голос
/ 14 февраля 2012

У меня есть ap: dataGrid, который обновлялся в 3.0.1.Теперь я обновился до PF 3.1, и событие обновления ajax компонента «availableIcons» больше не срабатывает.Я не получаю сообщение об ошибке, что компонент не найден в представлении.

XHMTL

<h:form id="Application">
......
<p:confirmDialog id="iconDialog" message="Select one icon"
            showEffect="bounce" hideEffect="explode" header="Icon Selection"
            severity="alert" widgetVar="iconSelect" modal="false">

            <p:dataGrid id="availableIcons" var="icon"
                value="#{appEditController.availableIcons}" columns="4">

                <p:column>
                    <p:panel id="pnl" header="" style="text-align:center">
                        <h:panelGrid columns="1" style="width:100%" id="iconPanelGrid">
                            <p:graphicImage value="/resources/icons/#{icon.icon}"
                                id="iconImage" />
                            <p:selectBooleanCheckbox id="iconSelector"
                                value="#{icon.selected}"
                                disabled="#{appEditController.isIconSelected(icon)}">
                                <p:ajax update="availableIcons" event="change"
                                    process="availableIcons"
                                    listener="#{appEditController.iconSelectedChanged(icon)}" />
                            </p:selectBooleanCheckbox>
                        </h:panelGrid>
                    </p:panel>

                </p:column>

            </p:dataGrid>

            <p:commandButton value="Done" update="currentIcon"
                action="#{appEditController.updateCurrentIcon}" ajax="false"
                oncomplete="iconSelect.hide()" />

        </p:confirmDialog>

.......
</h:form>

Я не вижу, что отсутствует или что неправильно.

Это код поддерживающего бина

public void updateCurrentIcon() {
    for (IconVO iconVO : availableIcons) {
        if (iconVO.isSelected()) {
            log.debug("CURRENT ICON IS NOW " + iconVO.getIcon());

            currentIcon = iconVO;

            break;
        }
    }
}

public void iconSelectedChanged(IconVO iconVO) {


    if (iconVO == currentIcon) {
        log.debug("NULLING ICON");
        currentIcon = null;
    } else {
        log.debug("SETTING NEW ICON");
        currentIcon = iconVO;
    }

}

public boolean isIconSelected(IconVO iconVO) {

    log.debug("IS ICON SELECTED " + iconVO.getIcon());

    if (currentIcon == null
            || iconVO.getIcon().equals(currentIcon.getIcon())) {
        return false;
    }

    return currentIcon != null;
}

Я попытался сделать update = "@ form", затем обновление запускается, но полностью закрывает модальную панель.

Спасибо, Коэн

1 Ответ

1 голос
/ 15 февраля 2012

Действительно, способ, которым PrimeFaces находит компоненты по относительному идентификатору клиента, был изменен в PrimeFaces 3.1 , чтобы придерживаться UIComponent#findComponent() javadoc .

В вашем конкретном случаеВ этом случае вам необходимо указать абсолютный идентификатор клиента для <p:dataGrid>.Самый простой способ понять это - проверить идентификатор <p:dataGrid> в сгенерированном источнике HTML.С приведенным выше кодом это будет Application:availableIcons.Вам нужно поставить перед ним префикс :, чтобы сделать его абсолютным, а затем ссылаться на него в update следующим образом:

<p:ajax update=":Application:availableIcons" ... />

Обновить в соответствии с полученными комментариямивообще не работать.Вы можете попробовать обернуть таблицу в некоторый невидимый содержащий компонент, такой как <h:panelGroup>, и обновить его.В качестве альтернативы, вы можете рассмотреть возможность перемещения <h:form> в диалоговое окно и использовать вместо него update="@form".В любом случае наличие <h:form> вне диалогового окна выглядит странно.Вы, конечно, не будете отправлять все другие входные данные, которые находятся вне диалогового окна внутри той же формы.

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