JSF Partial Update: Обновление кнопок в таблице
От: PoM-PoM 40mm Россия  
Дата: 08.06.12 12:59
Оценка:
Натолкнулся на очень неприятный момент, излазил исходники, но не могу понять в чем дело. Имеем PrimeFaces + spring, но с этим проблем нет, все в общем работает.
Есть табличка с паджинацией и выделением одной записи, надо было сделать, чтобы при смене страницы выделение слетало (а то выделанная запись вне видимой части это плохо). Для этого был добавлен p:ajax event="page"
и он успешно вызывает метод очистки выделения. Но потребовались еще две кнопки, которые должны быть доступны только если запись выделена(точнее их доступность зависит от самой выделенной записи). Для этого в бине завел два метода
getDisabledUp/getDisabledDown.

Если мы выделяем запись мышой, тогда методы getDisabledUp/getDisabledDown вызываются и кнопки становятся доступными. А вот если мы меняем номер — тогда они не вызываются вообще (хотя метод getSelectedPair/getPairs) вызывается.
фрагмент из xhtml файла. Причем евенты для rowSelect/page в общем-то одинаковы, списки обновления у них идентичные. Идентификаторы объектов указаны правильно, исключений нет. Попытка отладки показала, что при выделении записи или при смене страницы немного по разному внутри JSF проходит визитор по деревьям компонентов, в ряде случаев не заходит внутрь дочерних фасетов и не обновляя дочерние компоненты (а кноки они в дочернем фасете). Если у кого есть какие идеи — буду очень признателен

<h:form id="pairForm">
                        <p:dataTable id="dataTable" var="pair" value="#{pairOperationsBean.pairs}"
                                     binding="#{pairOperationsBean.dataTable}"
                                     paginator="true" rows="5"
                                     paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                                     rowsPerPageTemplate="5,10,15"
                                     paginatorPosition="bottom"
                                     selection="#{pairOperationsBean.selectedPair}" selectionMode="single" rowKey="#{pair.pairId}">

                            <p:ajax event="rowSelect" update="upbutton, downbutton" listener="#{pairOperationsBean.onPairSelect}"/>

                            <p:ajax event="page" update="upbutton, downbutton" listener="#{pairOperationsBean.onPairPage}"/>

                            <f:facet name="header">
                                Pairs <p:commandButton value="Up" update=":pairForm:dataTable, upbutton, downbutton" id="upbutton" actionListener="#{pairOperationsBean.moveUp}" disabled="#{pairOperationsBean.disabledUp}"/>
                                      <p:commandButton value="Down" update=":pairForm:dataTable, upbutton, downbutton" id="downbutton" actionListener="#{pairOperationsBean.moveDown}" disabled="#{pairOperationsBean.disabledDown}"/>
                            </f:facet>

                            <p:column id="pairName">
                                <h:outputText value="#{pair.pairName}"/>
                            </p:column>
                        </p:dataTable>
</h:form>


фрагмент бина



@Component("pairOperationsBean")
@Scope(value = "view", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class JSFPairBean {
....    
    public SimplePairRow getSelectedPair() {
        return selectedPair;
    }

    public void setSelectedPair(SimplePairRow selectedPair) {
        this.selectedPair = selectedPair;
    }

    public void clearSelection() {
        selectedPair = null;
    }

    public void onPairSelect(org.primefaces.event.SelectEvent event) {
        // function call is critical important, content not
    }

    public void onPairPage(PageEvent event) {
        clearSelection();
    }

    public boolean getDisabledUp() {
       
        return someCode(selectedPair);
    }

    public boolean getDisabledDown() {
        return someCode(selectedPair);
    }
...
}
Will give me piece of mind
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.