你如何让 PrimeFaces p:blockUI 动态地阻止某个处于 EL 状态的组件?
用例:
手头的条件基本上是用户可以在页面上使用的模式:如果有任何超出的碰撞并且它们当前在用户请求下显示然后阻止导航树(显示超出的碰撞模式,导航树被阻止),否则我们处于常规 View 中,导航树应该畅通无阻(显示常规碰撞模式,导航树畅通无阻)。
当前的问题是,当处于“超出模式”时,当状态更改对话框将状态更改为未超出时,页面会正确呈现/更新自身回到常规模式,但导航上的阴影树还在那里。由于我们现在处于常规模式,如果不再有超出的碰撞,我需要一些方法来解锁。
明白了吗? :-)
好的,首先是 bean 属性:
/*
* The logic of this method ensures that after status update the
* mode is automatically put back into regular view if no followup
* date exceeded collisions exist.
*/
public boolean isFollowupExceededCollisionsShown()
{
return getFollowupExceededCount() > 0 ? this.followupExceededCollisionsShown : false;
}
第一次尝试:
查看 VDL 文档 http://www.primefaces.org/docs/vdl/3.4/primefaces-p/blockUI.html透露 一些被屏蔽的属性。
<p:blockUI widgetVar="explorerBlocker"
block=":explorer-form"
blocked="#{collisionManager.followupExceededCollisionsShown}" />
然而,以上内容绝对没有任何作用。
第二次尝试:
看展柜http://www.primefaces.org/showcase/ui/blockUI.jsf ,客户端 API 似乎更合适。
我们的想法是在状态更改对话框中按下 OK 时,根据 ValueExpression 调用 show() 或 hide():
<p:dialog id="state-change-dialog"
widgetVar="stateChangeDialog"
modal="true"
appendToBody="true">
<h:form>
<ui:include src="/view/collisionmgmt/collisionStatusChangeGrid.xhtml" />
<h:panelGroup layout="block" styleClass="center-button-panel">
<p:commandButton id="save-button"
icon="ui-icon ui-icon-disk"
value="OK"
action="#{collisionManager.performStatusChange}"
process="@form"
update=":explorer-form:tree :collision-form:period-grid :collision-form:list :collision-form:growl"
oncomplete="stateChangeDialog.hide();" />
<p:commandButton icon="ui-icon ui-icon-close"
value="Cancel"
update=":collision-form:list"
onclick="stateChangeDialog.hide();"
immediate="true" />
</h:panelGroup>
</h:form>
</p:dialog>
我们的想法是通过调用 explorerBlocker.show();
或 explorerBlocker.hide();
以某种方式扩展 OK 按钮的 oncomplete="",具体取决于EL #{collisionManager.followupExceededCollisionsShown}
的新值。
我尝试了两种基本变体:
oncomplete="stateChangeDialog.hide(); #{collisionManager.followupExceededCollisionsShown ? 'explorerBlocker.show();' : 'explorerBlocker.hide();' }"
oncomplete="stateChangeDialog.hide(); if ( #{collisionManager.followupExceededCollisionsShown} ){ explorerBlocker.show(); } else { explorerBlocker.hide(); }"
状态更改对话框一直关闭,但上面的逻辑没有启动。
我一定是在这里犯了一些本质上的错误。我怀疑 OK 按钮的 oncomplete EL 表达式在被单击时没有得到重新评估。将 @this 添加到更新列表不会改变任何内容。
update="@this :explorer-form:tree :collision-form:period-grid :collision-form:list :collision-form:growl"
如何最好地解决我的问题,其中“最佳”首先是仅 JSF,然后是 PrimeFaces 特定(理想情况下,这是记录在案的地方!)。
是否可以在 EL 中使用 blockUI blocked="#{?}"属性?
谢谢
最佳答案
一种方法是从Managed Bean调用BlockUI的hide()和show()方法。
您可以使用 RequestContext 来做到这一点:
RequestContext.getCurrentInstance().execute("widgetVar.show()");
另一种方法是您可以将变量传递给 JavaScript 函数,然后让 Javascript 函数为您处理。
onClick="func(#{elvariable})"
<script type="text/javascript">
function func(value)
{
if(value==something){
widgetVar.show();
}else{
widgetVar.hide();
}
}
</script>
关于javascript - PrimeFaces p :blockUI blocking a certain component dynamically (on JSF EL condition)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14938862/