我正在从 RichFaces 3.3.3 迁移到 4.0,遇到了一个不知道如何解决的问题。

到现在为止,我已经使用 RichFaces 的@KeepAlive 注释来实现带有 bean 的 View 范围,但是到目前为止,新版本 4 没有这样的功能(据我所知)。所以我认为 @ViewScoped 注释将是自然(且快速)的替代品,但它不起作用。
这是给我带来麻烦的相关代码。它呈现一个包含客户名称的表格作为链接,因此当点击一个名字时,它会弹出一个弹出窗口来编辑数据。它适用于带有@KeepAlive 的 v3.3.3,但不适用于带有 @ViewScoped 的 v4(不会调用弹出窗口)。

这页纸:

<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>

bean :
@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;
    }
}

任何帮助,将不胜感激

最佳答案

可能不会调用您的操作的原因有两个:

  • 您有一个已提交的字段,但 验证/转换失败 。如果您有验证或转换错误,则不会调用您的操作。你应该有一个 <h:messages> 以确保你看到它,因为它是 a4j:clickLink 把它放在一个 a4j:outputPanel 中,像这样: <a4j:outputPanel ajaxRendered="true"><h:messages/></a4j:outputPanel>
  • 您在另一个 <h:form> 中有 一个 <h:form> ,并且您正在尝试提交内部的。您可以使用 firebug 非常轻松地跟踪此情况。由于某种原因,JSF 决定不做任何事情。

  • 看起来你在这里做一些时髦的生意:
  • 重新渲染表单 。我在 JSF2 中重新渲染 <h:form> 时遇到了严重的问题(即它们停止工作),尤其是。使用 Richfaces 模式面板,通过他们实现实际面板的方式变得可能,在那里他们将内容从 <body> 元素中 DOM 中的任何位置移动。因此,我建议在表单中创建一个 <h:panelGrid>,然后重新渲染它。
  • <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}"/>
    

    关于jsf - RichFaces 4 和 @ViewScoped,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5547863/

    10-11 00:41