我在第1页中有一个h:commandlink控件。控件使用f:ajax调用以下h:panelgroup:
我在第2页(一个片段)中有一个h:panelgroup控件,其中包含一个ui:include。 我在第3页(一个片段)中有一个h:panelgroup控件,其中包含一个ui:include。
现在根据第1页上的选择,我想通过点击h:commandlink控件来切换片段。
我在那里遇到了一个大问题:似乎只有我在命令链接上点击两次,才会改变代码段 - 而不是一次点击。
我试图删除f:ajax来渲染面板组,但它仍无效......
答案 0 :(得分:0)
这个问题有两个可能的原因。
<f:ajax>
完全重新渲染另一个 <h:form>
而不是它所在的位置。这样,另一种形式的视图状态将会丢失需要在真正执行之前两次调用另一个表单上的操作。
解决方案是不重新渲染其他<h:form>
,而只重新呈现该表单中的某个容器组件。 E.g。
<h:form id="otherForm">
<h:panelGroup id="content">
...
<h:panelGroup>
</h:form>
与
<f:ajax render=":otherForm:content" />
如果rendered
或其任何父组件上有<h:commandLink>
属性,那么必须在申请请求值期间评估true
回发请求的阶段,以便让JSF在该请求的调用操作阶段调用与<h:commandLink>
关联的bean操作。可能bean是请求作用域和/或bean内部的一些奇怪/不合逻辑的流导致rendered
属性未被正确保留。
最好是在rendered
bean中维护这些@ViewScoped
条件并让其操作方法返回void
或null
,这样只要你有豆就活着与同一视图交互。仅在操作方法期间更改rendered
条件,而不是在setter / getters或其他内容中更改。