我有一个带有形式的自定义标记文件:
<h:form> <h:commandButton value="click"> <f:ajax event="click" listener="#{bean[method]}" /> </h:commandButton> </h:form>
我有条件地通过ajax渲染它,如下所示:
<h:panelGroup id="test"> <h:form> <h:commandButton value="click"> <f:ajax event="click" listener="#{backingTest.updateFlag}" render=":test"/> </h:commandButton> </h:form> <h:panelGroup rendered="#{backingTest.flag}"> <my:customtag bean="#{backingTest}" method="printMessage"/> </h:panelGroup> </h:panelGroup>
这是关联的支持bean:
import javax.faces.bean.ManagedBean; import javax.faces.bean.RequestScoped; @ManagedBean @RequestScoped public class BackingTest { private boolean flag = false; public void printMessage() { System.out.println("hello"); } public void updateFlag() { flag = true; } public boolean getFlag() { return flag; } }
当我单击第一个命令按钮时,将updateFlag()正确调用该方法,并正确显示第二个命令按钮。但是,当我单击第二个命令按钮时,它从未命中该printMessage()方法。在Web浏览器的JS控制台和HTTP流量监视器中,我可以看到该click事件已成功触发,并且XHR POST请求已成功发送。
updateFlag()
printMessage()
click
如果删除该rendered属性,那么一切都会按预期进行。
rendered
这是怎么引起的,我该如何解决?我正在使用Mojarra 2.1.25。
您的具体问题是由两个事实引起的:
在您的特定情况下,rendered条件已评估,false而JSF需要解码表单提交操作,因此永远不会处理未渲染的输入/命令组件。
false
将bean放入视图范围应该可以修复它。下面的示例假定使用JSF2.x。
import javax.faces.bean.ManagedBean; import javax.faces.bean.ViewScoped; @ManagedBean @ViewScoped
下面的示例假定具有CDI的JSF 2.2+:
import javax.inject.Named; import javax.faces.view.ViewScoped; @Named @ViewScoped