我正在从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;
}
}
任何帮助将不胜感激
不调用您的操作有两个原因:
您有一个已提交的字段,但验证/转换失败。如果您遇到验证或转换错误,则不会调用您的操作。你应该有一个
<h:messages>
来确保你看到它,因为它是a4j:clickLink把它放在一个像这样的a4j:outputPanel
里:<a4j:outputPanel ajaxRendered="true"><h:messages/></a4j:outputPanel>
。你在另一个
<h:form>
里面有一个<h:form>
,你正在尝试提交内部的。你可以用火虫跟踪它真的非常容易。出于某种原因,JSF 决定不做任何事情。
看起来你在这里做一些时髦的生意:
- 重新呈现表单。我在 JSF2 中重新渲染
<h:form>
s 时遇到了严重的问题(即它们停止工作),尤其是使用富面模态面板,通过他们实现实际面板的方式变得可行,他们将内容从 DOM 中的任何位置移动到<body>
元素中。因此,我建议在表单内创建一个<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}"/>