Натолкнулся на очень неприятный момент, излазил исходники, но не могу понять в чем дело. Имеем 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);
}
...
}