我有
- <h:form>
- <h:commandLink action="#{my_fake_ajax_link}">
- <h:outputText value="Link" />
- <f:ajax render=":mydiv" />
- </h:commandLink>
- </h:form>
- <h:panelGroup layout="block" id="mydiv">
- <h:form>
- <h:commandLink action="#{mybean.delete(0)}">
- <h:outputText value="Here" />
- <f:ajax render="@form" />
- </h:commandLink>
- </h:form>
- </h:panelGroup>
当我点击“my_fake_ajax_link”一次,那么我必须在“删除”链接上点击两次.这只是一个例子.我没有这个真实的情况.我在一个页面上有多个表单,我不能将它们全部添加到单个表单中.
我检查了问题是什么,它是:
>当您点击“my_fake_ajax_link”时,mydiv将使用ajax进行刷新.
>在ajax上刷新表单的ViewState丢失.
如何添加ViewState?如何才能使其工作,而不使用一个表单?这看起来像是JSF的错误.我不想自动刷新该div
- jQuery("#mydiv").load(document.location.href);
但我会在最坏的情况下可能.
这是JSF自动包含的jsf.js库中处理ajax响应的已知问题.另见
JSF spec issue 790在即将到来的JSF 2.3中是固定的.同时,使用JSF 2.0 / 2.1 / 2.2,您必须明确指定其他< h:form>的ID.在渲染属性内部触发正确添加视图状态.
- <h:form>
- <h:commandLink action="#{my_fake_ajax_link}">
- <h:outputText value="Link" />
- <f:ajax render=":mydiv :mydivForm" />
- </h:commandLink>
- </h:form>
- <h:panelGroup layout="block" id="mydiv">
- <h:form id="mydivForm">
- <h:commandLink action="#{mybean.delete(0)}">
- <h:outputText value="Here" />
- <f:ajax render="@form" />
- </h:commandLink>
- </h:form>
- </h:panelGroup>
不,这不会导致ajax响应中的任何开销或标记重复.或者,使用OmniFaces fixviewstate.js
.
也可以看看:
> Communication in JSF 2.0 – Ajax rendering of content which contains another form
> h:commandButton/h:commandLink does not work on first click,works only on second click