我知道这个问题一遍又一遍地问。我确实对所有与此有关的问题提出了建议,我在this question that I put
中做了BalusC告诉我,我还没有成功。 所以Web应用程序的流程是:
我登录,成功时boolean loggedIn变为true,页面被重定向到home.xhtml。 (Bean TestBean和EnterView被实例化并且SessionScoped)。在这个页面中,如果loggedIn布尔值为真,我有4个链接。
不使用JSTL c:选择标签(因为JSTL和JSF“在视图构建期间运行,另一个在视图渲染时运行。” - BalusC)我使用了渲染属性。
显示带有链接的列表,但我必须单击它们两次以执行应该执行的操作。
摘录:
<h:form rendered="#{enterView.userBean.loggedIn}">
<ul id="grileList">
<li><h:commandLink action="#{menuView.showTestsPage(1)}"
value="label1" rendered="#{enterView.userBean.loggedIn}"/></li>
<li><h:commandLink action="#{menuView.showTestsPage(2)}"
value="label2" rendered="#{enterView.userBean.loggedIn}"/></li>
<li><h:commandLink action="#{menuView.showTestsPage(3)}"
value="label3" rendered="#{enterView.userBean.loggedIn}"/></li>
<li><h:commandLink action="#{menView.showTestsPage(4)}"
value="label4" rendered="#{enterView.userBean.loggedIn}"/></li>
</ul>
</h:form>
h:表单正确呈现,因此它已经完成了视图呈现阶段,但是当我单击链接时(当我单击它们两次时)它不会执行操作,所以它是视图构建时间吗? ??我读到了他们两个,我以为我明白了......
我已将render属性放在commandLinks中以尝试渲染它们,但我没有成功。
答案 0 :(得分:3)
JSF spec issue 790的结果可以识别“需要点击两次才能调用动作”的症状,这在即将到来的JSF 2.2中得到修复。
到目前为止,如果你有两个表单,而另一个表单只通过ajax更新另一个表单的父组件,那么另一个表单将失去其JSF视图状态(<input type="hidden" name="javax.faces.ViewState">
)。首次以其他形式调用ajax操作不会调用任何操作,但会重新添加JSF视图状态,然后任何后续操作都会成功。
要解决此问题,您需要在ajax渲染中显式指定其他表单的客户端ID。 E.g。
<f:ajax ... render=":someComponent :otherForm" />
...
<h:someComponent id="someComponent">
<h:form id="otherForm" rendered="#{enterView.userBean.loggedIn}">
...