我遇到了一个奇怪的问题。我正在尝试在模式对话框上放置多个表单,并且一次只能看到一个表单基于标志,从一个表单动态切换到另一个表单以响应用户操作。问题是,通过向表单添加呈现的属性会导致Ajax事件无法调用辅助bean中的服务器端方法。
以下表单和支持bean是简化副本,但它证明了这个问题。基本上,如果render =“#{requestScope.shouldRender}”从h:form id =“form2”中删除,当您在文本字段中输入时,一切都按预期工作,文本将显示在控制台上。如果将render =“#{requestScope.shouldRender}”添加到h:form id =“form2”组件,则根本不会调用该方法。
环境是: Primefaces 3.3 春天3.0 Websphere服务器7
以下是带有渲染属性的示例表单(删除以使其正常工作):
<h:body>
<h:form id="form1">
<p:commandButton id="showButton" value="Show" update=":panel1">
<f:setPropertyActionListener value="#{true}"
target="#{requestScope.shouldRender}" />
</p:commandButton>
</h:form>
<p:outputPanel id="panel1">
<h:form id="form2" rendered="#{requestScope.shouldRender}">
<p:inputText id="fn" value="#{testBean.fn}">
<p:ajax event="keyup" listener="#{testBean.valueChangeListener}" />
</p:inputText>
</h:form>
</p:outputPanel>
</h:body>
这是一个小支持bean:
@Component
@Scope("request")
public class TestBean {
private String fn;
public void setFn(String fn) {
this.fn = fn;
}
public String getFn() {
return fn;
}
public void valueChangeListener() {
System.out.println(fn);
}
}