富人脸4和@ViewScoped



我正在从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. 您有一个已提交的字段,但验证/转换失败。如果您遇到验证或转换错误,则不会调用您的操作。你应该有一个<h:messages>来确保你看到它,因为它是a4j:clickLink把它放在一个像这样的a4j:outputPanel里:<a4j:outputPanel ajaxRendered="true"><h:messages/></a4j:outputPanel>

  2. 你在另一个<h:form>里面有一个<h:form>,你正在尝试提交内部的。你可以用火虫跟踪它真的非常容易。出于某种原因,JSF 决定不做任何事情。

看起来你在这里做一些时髦的生意:

  1. 重新呈现表单。我在 JSF2 中重新渲染 <h:form> s 时遇到了严重的问题(即它们停止工作),尤其是使用富面模态面板,通过他们实现实际面板的方式变得可行,他们将内容从 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}"/>

相关内容

  • 没有找到相关文章

最新更新