RichFaces 4 и @ViewScoped - PullRequest
       2

RichFaces 4 и @ViewScoped

4 голосов
/ 05 апреля 2011

Я перехожу с RichFaces 3.3.3 на 4.0 и столкнулся с проблемой, которая не может понять, как ее решить.

До сих пор я использовал аннотацию RichFaces @ KeepAlive для достижения области просмотра с помощью bean-компонентов, но в новой версии 4 пока нет такой функции (насколько я знаю). Поэтому я подумал, что аннотация @ViewScoped будет естественной (и быстрой) заменой, но она не работает. Вот соответствующий код, который доставляет мне неприятности. Он отображает таблицу, содержащую клиентов с их именами в виде ссылок, поэтому при нажатии на имя появляется всплывающее окно для редактирования данных. Он работает в v3.3.3 с @KeepAlive, но не работает в v4 с @ViewScoped (всплывающее окно не вызывается).

Страница:

<h:form prependId="false">
 <rich:dataTable id="table" value="#{myBean.customers}" var="customer">
    <!--...headers...-->
    <h:column>
        <a4j:commandLink action="#{myBean.selectCustomer}"
            oncomplete="#{rich:component('popup_customer_editor')}.show();" render="form_customer_editor">
            ${customer.name}
            <f:setPropertyActionListener value="#{customer}" target="#{myBean.selectedCustomer}"/>
        </a4j:commandLink>
    </h:column>
    <h:column>${customer.address}</h:column>
 </rich:dataTable>
</h:form>

<rich:popupPanel id="popup_customer_editor>
    <h:form id="form_customer_editor">
    <!--...form fields...-->
    </h:form>
</rich:popupPanel>

Боб:

@ManagedBean
@ViewScoped   //It was @KeepAlive before
public class MyBean implements Serializable
{
    private String name;
    private String address;
    private Customer selectedCustomer;  //POJO class
    //getters and setters
    ...
    public String selectCustomer()
    {
        name = selectedCustomer.getName();
        address = selectedCustomer.getAddress();

        return null;
    }
}

Любая помощь будет оценена

1 Ответ

3 голосов
/ 05 апреля 2011

Есть две причины, по которым ваше действие может не называться:

  1. У вас есть поле, которое отправлено, и проверка / преобразование не удалась . Ваше действие не будет выполнено, если у вас есть ошибки проверки или преобразования. У вас должно быть <h:messages>, чтобы быть уверенным, что вы его видите, и, поскольку это a4j: clickLink поместит его внутрь a4j:outputPanel, например так: <a4j:outputPanel ajaxRendered="true"><h:messages/></a4j:outputPanel>.

  2. У вас есть и <h:form> внутри другого <h:form>, и вы пытаетесь отправить внутреннее. Вы можете отследить это с помощью firebug действительно-очень легко. JSF решает вообще ничего не делать по какой-либо причине.

Похоже, что вы делаете здесь какие-то забавные дела:

  1. перерисовать формы . У меня были серьезные проблемы с перерисовкой <h:form> s в JSF2 (а именно, они перестали работать), особенно. с модальной панелью richfaces, сделанной возможной благодаря тому, что они реализуют фактическую панель, куда они перемещают контент из любой точки DOM в элемент <body>. Таким образом, я рекомендую создать <h:panelGrid> внутри формы и повторно отрендерить его.
  2. <f:setPropertyActionListener>. В самом деле? У вас также должен быть EL2, чтобы вы могли изменить это:

    <a4j:commandLink action="#{myBean.selectCustomer}"
        oncomplete="#{rich:component('popup_customer_editor')}.show();"
        render="form_customer_editor">
             ${customer.name}
        <f:setPropertyActionListener value="#{customer}"
            target="#{myBean.selectedCustomer}"/>
    </a4j:commandLink>
    

до

<a4j:commandLink action="#{myBean.selectCustomer(customer)}"
    oncomplete="#{rich:component('popup_customer_editor')}.show();" render="form_customer_editor" value=#{customer.name}"/>

...