【发布时间】:2015-09-01 10:31:49
【问题描述】:
我正在尝试从 ListDataModel 更新(合并)一个字段,并且我遇到了我认为是 Jsf (Mojara) 2.2 中的错误。仅当两次单击 PrimeFaces 命令按钮时更新才有效。我在这里阅读了许多帖子并尝试了解决方案,但似乎没有任何效果:
h:commandButton/h:commandLink does not work on first click, works only on second click
commandButton only works on the second click
p:commandButton with p:fileDownload and no ajax only works in second click
名单来自
<h:form>
<p:dataTable value="#{proDocFolBean.selectedProDocs}" var="docs">
<p:column headerText="Document Name:">
<h:outputText value="#{docs.docName}"/>
</p:column>
<p:column headerText="Description">
<h:outputText value="#{docs.description}"/>
</p:column>
<p:column headerText="Date Created">
<h:outputText value="#{docs.dateCreated}">
<f:convertDateTime pattern="dd-MMM-yyyy" />
</h:outputText>
</p:column>
<p:column headerText="Classification">
<h:outputText value="#{docs.classification}"/>
</p:column>
<p:column>
*** <p:commandLink value="Update" action="#{proDocFolBean.prepareUpdateDoc}"/> ***
</p:column>
<p:column>
<p:commandLink id="downLoadLink" value="Download" ajax="false">
<p:fileDownload value="#{proDocFolBean.downloadFromFolders}"
contentDisposition="attachment"/>
</p:commandLink>
....
</h:form>
点击上面表单中的Update链接,会调用bean中的preparedUpdate方法:
public String prepareUpdateDoc() {
docToUpdate = selectedProDocs.getRowData();
selectedId = docToUpdate.getProjectDocId();
docsFacade.find(selectedId);
return "UpdateProDoc";
}
上述方法填充更新表单:
<h:outputScript name="js/formbugfix.js" target="head" />
<p:inputTextarea rows="30" cols="60" value="#{proDocFolBean.docToUpdate.description}" immediate="true"/>
<p>
<p:commandButton value="Change" action="#{proDocFolBean.updateProjectDoc}">
<!-- <f:ajax execute="@form"/> -->
</p:commandButton>
虽然我意识到 PF 已经通过嵌入式 js 修复了视图状态,但我包含了一个 js 脚本。我认为可能包括此question 中所述的脚本。
可能会解决问题,但会导致相同的行为。
最后,表单在bean中调用如下merge方法:
public String updateProjectDoc() {
docsFacade.update(docToUpdate);
return "ProSysHome";
}
如果我尝试使用 h:commandbutton 或使用 p:commandButton 将 ajax 设置为 false(不使用 js 脚本),表单会被简单地刷新并且更新的值不会合并到数据库中。如果我单独使用 p:commandButton,我可以让操作正常工作,但只有在单击两次之后。这是非常奇怪的行为,将不胜感激。提前致谢!
【问题讨论】:
-
PrimeFaces 已经提供了视图状态修复。只需使用 p:commandButton,无需包含多余的 formbugfix.js。
-
1.
prepareUpdateDoc返回结果,所以涉及导航?这使得 bean 范围相关。 2. 在p:inputTextarea中immediate="true"似乎没有必要。 -
我意识到 PF 已经提供了视图状态修复(因为它包含嵌入式 jQuery),但是单独使用 p:commandButton 会导致与使用脚本相同的行为。使用 h:commandButton 会导致表单自行刷新并且合并完全失败
-
感谢 Vsevolod。是的,其中涉及导航,并且 bean 范围是 SessionScoped(与应用程序中的其他合并操作一起工作)。我只是把 immediate=true 作为一个长镜头,但删除它并不会改变行为。
-
第一次点击是否会发生 POST 请求?第一次点击时会调用
updateProjectDoc方法吗?
标签: javascript ajax jsf primefaces jsf-2.2