我正在尝试创建一个数据表,每当它繁忙时都会显示一个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也将被更新。