我在page1中有一个h:commandlink控件。控件使用f:ajax调用以下h:panelgroup:
我在page2中有一个h:panelgroup控件(一个片段(,其中有一个ui:include。我在page3中有一个h:panelgroup控件(一个片段(,其中有一个ui:include
现在,根据第1页上的选择,我想通过单击h:commandlink控件来切换代码段。
我有一个大问题:似乎只有当我在命令链接上点击两次时,代码片段才会改变——而不是一次点击。
我试图删除f:ajax来渲染面板组,但它仍然不起作用。。。
这个问题有两个潜在的原因。
-
<f:ajax>
完全重新呈现另一个<h:form>
,而不是它所在的位置。这样,另一个窗体的视图状态将丢失,这需要在真正执行之前调用另一个表单上的操作两次。解决方案是不重新呈现其他
<h:form>
,而只呈现该形式的一些容器组件。例如<h:form id="otherForm"> <h:panelGroup id="content"> ... <h:panelGroup> </h:form>
带有
<f:ajax render=":otherForm:content" />
-
当
<h:commandLink>
或其任何父组件上有rendered
属性时,它必须在回发请求的应用请求值阶段评估true
,以便让JSF在该请求的调用操作阶段调用与<h:commandLink>
关联的bean操作。也许bean是请求范围的,和/或bean内部的一些奇怪/不合逻辑的流导致rendered
属性没有得到正确保留。最好是在
@ViewScoped
bean中维护这些rendered
条件,并让其操作方法返回void
或null
,这样,只要您与同一视图交互,bean就会一直存在。仅在操作方法期间更改rendered
条件,而不在setters/getters或其他内部更改。