p:commandButton只有两次点击(JSF 2.2 Bug?)

时间:2015-06-16 14:22:38

标签: javascript ajax jsf primefaces jsf-2.2

我正在尝试从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>

我包含了一个js脚本,虽然我意识到PF已经通过嵌入式js修复了视图状态。我认为可能包括这个question中所述的脚本。

可能会解决问题,但会导致相同的行为。

最后,表单在bean中调用以下合并方法:

public String updateProjectDoc() {
    docsFacade.update(docToUpdate);
    return "ProSysHome";
}

如果我尝试使用h:commandbutton或使用p:commandButton(没有js脚本)将ajax设置为false,则只需刷新表单,并且更新的值不会合并到数据库中。如果我自己使用p:commandButton,我可以让操作正常工作,但只需点击两下。这是非常奇怪的行为,并将感谢任何帮助。提前谢谢!

3 个答案:

答案 0 :(得分:0)

嗯,我想我用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错误消失了?

答案 1 :(得分:0)

我遇到了这个问题,但就我而言,有一个javax.faces.application.ViewExpiredException 这是一篇不错的文章javax.faces.application.ViewExpiredException: View could not be restored

答案 2 :(得分:0)

我也遇到了“两次点击”问题。就我而言,解决方案是使用

<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>