【问题标题】:p:commandButton only works with two clicks (JSF 2.2 Bug?)p:commandButton 仅适用于两次单击(JSF 2.2 Bug?)
【发布时间】: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:inputTextareaimmediate="true" 似乎没有必要。
  • 我意识到 PF 已经提供了视图状态修复(因为它包含嵌入式 jQuery),但是单独使用 p:commandButton 会导致与使用脚本相同的行为。使用 h:commandButton 会导致表单自行刷新并且合并完全失败
  • 感谢 Vsevolod。是的,其中涉及导航,并且 bean 范围是 SessionScoped(与应用程序中的其他合并操作一起工作)。我只是把 immediate=true 作为一个长镜头,但删除它并不会改变行为。
  • 第一次点击是否会发生 POST 请求?第一次点击时会调用updateProjectDoc 方法吗?

标签: javascript ajax jsf primefaces jsf-2.2


【解决方案1】:

我想我在 Vsevolod 的帮助下解决了这个问题。首先,完全没有必要使用单独的 js 脚本,因为正如 Vsevolod 所说,PF 有自己的修复程序。

单独使用 p:commandButton 我得到一个 javascript 错误

Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check http://xhr.spec.whatwg.org/.
VM94:25 Uncaught TypeError: Cannot read property 'debug' of undefined

这个错误似乎来自于我单击 UPDATE 链接以调用 prepareUpdateDoc 方法并填充更新表单时的原始列表表单。将此列上的 ajax 设置为 false 解决了问题:

 <p:column>
 <p:commandLink value="Update" action="#    {proDocFolBean.prepareUpdateDoc}" ajax="false"/>

  </p:column>

单击后表单现在可以工作,但我仍然想知道原因是否是由于两次重复的 ajax 调用(一个来自列表表单 p:commandLink,第二个来自 p:commandButton 的实际更新调用) 以及为什么设置ajax为false后js错误消失?

【讨论】:

    【解决方案2】:

    我也有这个“2 点击”问题。就我而言,解决方案是使用

    <p:commandLink value="Update" id="sButton" action="#{myBean.myAction}" update=":myForm"/>
    

    而不是

    <p:commandLink value="Update" id="sButton" action="#{myBean.myAction}">
                            <p:ajax event="click" update=":myForm"/>
                        </p:commandLink>
    

    【讨论】:

    • 你知道区别吗?
    • 查看 BalusC 的帖子我看到他们只更新请求的组件,但我没有看到 commandButton 和 ajax "update" stackoverflow.com/questions/25339056/… 之间的区别
    • p:commandButton 内置了 ajax,因此通过在其中插入 ajax,您可以使行为有点未定义。没有明确表示你的错,因为我本来希望(或至少希望) pf 组件对此发出警告
    【解决方案3】:

    我遇到了这个问题,但在我的情况下,出现了 javax.faces.application.ViewExpiredException 这是一篇关于它的好文章javax.faces.application.ViewExpiredException: View could not be restored

    【讨论】:

      猜你喜欢
      • 2017-05-21
      • 2015-11-24
      • 1970-01-01
      • 2014-06-22
      • 2013-06-12
      • 1970-01-01
      • 2016-09-13
      • 2022-01-24
      相关资源
      最近更新 更多