ajax更新后Primefaces blockUI停止工作



我正在尝试创建一个数据表,每当它繁忙时都会显示一个blockUI,我已经取得了很大的成功。现在,每当我单击两个命令按钮中的任何一个,通过单击标题对数据表进行排序,或浏览数据表时,它都会变灰并显示"Loading…"。你可以在下面看到它的代码。

问题是,在我使用了其中一个commandButtons(它在被阻止的元素上运行ajax更新)之后,后续操作不会触发blockUI(直到我刷新页面)。例如:

  • 加载页面
  • 单击数据表标题-blockUI将出现,直到表完成排序
  • 单击数据表页面导航按钮之一-blockUI将出现,直到页面加载为止
  • 单击其中一个命令按钮-blockUI出现,直到按钮的actionListener完成为止
  • 单击数据表标题-表进行排序,但不会显示blockUI
  • 单击数据表页面导航按钮之一-页面加载,但不会显示blockUI
  • 单击其中一个命令按钮-actionListener运行并更新表,但不会显示blockUI
  • 重新加载页面-一切恢复正常

将commandButtons的update="属性更改为ajax="false"会导致排序/分页始终显示blockUI,但commandButton从不显示blockUI。

有什么想法吗?

<div class="buttonDiv">
    <p:commandButton ... update="resultsPanel" id="submitButton" ... />
    ...
    <p:commandButton ... update="resultsPanel" id="resetScenarioButton" ... />
</div>
<p:panel header="Results Grid" id="resultsPanel">
    ...
    <p:dataTable ... id="VAResults" ... >
        ...
    </p:dataTable>
    ....
</p:panel>
<p:blockUI block="resultsPanel" trigger="submitButton, resetScenarioButton, VAResults">
    Loading...
</p:blockUI>

trigger属性将jQuery侦听器绑定到指定的元素上。但是,如果更新元素,则绑定将丢失。我不知道它是否有效,但您可以尝试将<p:blockUI移动到resultsPanel中。我怀疑当您更新面板时,blockUI也会更新,从而将侦听器重新绑定到数据表。

<p:panel header="Results Grid" id="resultsPanel">
    ...
    <p:dataTable ... id="VAResults" ... >
        ...
    </p:dataTable>
    ....
    <p:blockUI block="resultsPanel" trigger="submitButton, resetScenarioButton, VAResults">
    Loading...
</p:blockUI>
</p:panel>

我遇到过同样的问题和类似的场景:

<p:dataTable>
    ....
    <p:ajax event="rowSelect" update="buttons" global="false" onstart="blockMessageButtons.show();" oncomplete="blockMessageButtons.hide();"/>
</p:dataTable>
<p:outputPanel layout="block" id="buttons">
    <!-- content to be blocked -->
</p:outputPanel>
<p:blockUI block="buttons" widgetVar="blockMessageButtons"/>

问题是面板按钮既被ajax更新,又被blockUI阻止。我不得不把它一分为二:

<p:dataTable>
    ....
    <p:ajax event="rowSelect" update="buttons-content" global="false" onstart="blockMessageButtons.show();" oncomplete="blockMessageButtons.hide();"/>
</p:dataTable>
<p:outputPanel layout="block" id="buttons-container">
    <p:outputPanel layout="block" id="buttons-content">
        <!-- content to be blocked -->
    </p:outputPanel>
</p:outputPanel>
<p:blockUI block="buttons-container" widgetVar="blockMessageButtons"/>

@siebz0r已经解释了组件更新时blockUI停止工作的原因。

我在模板中为所有其他页面使用一个blockUI元素,因此不想包含更多的blockUI元件。

如果blockUI元素也被更新,则不需要在将被更新的组件内移动blockUI。

这里有一个例子:

<p:panel id="surroundingPanel">
    ...
    <p:commandButton value="ButtonName" styleClass="blockUi"
        action="actionToBeExecuted" update=":surroundingPanel :blockUiBinding" />
</p:panel>
<p:outputPanel id="blockUiBinding">
    <p:blockUI block=":elementToBeBlocked" trigger="@(.blockUi)">
        Loading ...
    </p:blockUI>
</p:outputPanel>

元素blockUiBinding可以位于任何位置,只要它可以被更新即可。它正在包装blockUI元素,因为blockUI至少生成两个不同的div。因此,当包装元素被更新时,blockUI也将被更新。

相关内容

  • 没有找到相关文章

最新更新