2012-01-18 2 views
3

Это код:JSF Ajax CommandButton не обновление primefaces PickList

<h:form id="articleForm" > 
    <p:commandButton value="Select tags" ajax="true" > 
     <f:ajax execute="@form" render="@form :articleForm:tags" /> 
    </p:commandButton> 

    <p:pickList id="tags" value="#{articleController.dualListModelForTags}" var="tag" itemLabel="#{tag.tag}" itemValue="#{tag}" converter="distinctTagConverter"> 
     <f:facet name="sourceCaption">Distinct tags</f:facet> 
     <f:facet name="targetCaption">Connected tags</f:facet> 
    </p:pickList> 
</h:form> 

Когда CommandButton нажата, то getDualListModelForTags() в бэк-бина вызывается и выполняется. В getDualListModelForTags() я вношу некоторые изменения, поэтому я хочу, чтобы список выбора был обновлен. Но список выбора (id = tags) не отображается повторно. Только когда я обновляю страницу, это изменения, внесенные в список выбора.

ответ

12

Компонент PrimeFaces <p:commandButton> не работает вместе с <f:ajax>. Вместо этого вам нужно использовать собственные атрибуты ajax для кнопки. Вместо <f:ajax execute> вы должны использовать <p:commandButton process>. Но это уже по умолчанию @form, поэтому вы можете его опустить. Вместо <f:ajax render> вы должны использовать <p:commandButton update>. Указание идентификаторов клиентов, которые уже покрыты @form, не является необходимым, поэтому достаточно всего лишь @form. Также не нужен атрибут ajax="true", поскольку это уже по умолчанию.

Так что это нужно сделать:

<p:commandButton value="Select tags" update="@form" /> 

Unrelated к конкретной проблеме, вы делаете бизнес работу внутри метод получения. Это плохая идея. Сделайте это в методе action кнопки. Похоже, вы также используете компонент, обработанный сеансом, для просмотра данных с видимыми областями. Это плохая идея. Вместо этого поместите компонент в область видимости.

+0

Отличный ответ. Я думаю, вы знаете, что я использую фасоль с сессионным сеансом, потому что боновые вары остаются во время обновления страницы. Но почему лучшая область обзора? – BigJ

+1

Потому что вы имеете дело с областью видимых данных, а не с данными в области сеанса. Если вы обрабатываете данные с ограниченным охватом просмотра как данные с областью действия сеанса, то сторонник может видеть несоответствия, когда у конечного пользователя одна и та же страница (просмотр) открывается в нескольких окнах/вкладках в том же сеансе браузера и переключается между ними после каждого взаимодействия. – BalusC

Смежные вопросы