PrimeFaces p:blockUI动态地阻塞某个组件(在JSF EL条件下)



如何使PrimeFaces p:blockUI动态地阻止某个组件,即在EL条件下?

用例:

手头的条件基本上是用户可以在页面上处于的模式:如果有任何超出的碰撞,并且它们当前应用户请求显示,则阻止导航树(显示超出的碰撞模式,导航树被阻止),否则我们处于常规视图中,导航树应该被取消阻止(显示常规碰撞模式,引导树被取消阻止)。

目前的问题是,当处于"超出模式"时,当状态更改对话框将状态更改为"未超出"时,页面会正确地渲染/更新回常规模式,,但导航树上的阴影仍然存在。由于我们现在处于常规模式,如果没有超过的碰撞,我需要一些方法来解锁。

明白吗?:-)

好的,首先是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>

其想法是根据EL #{collisionManager.followupExceededCollisionsShown}的新值,通过调用explorerBlocker.show();explorerBlocker.hide();以某种方式扩展OK按钮的oncomplete="。

我尝试了两种基本的变体:

oncomplete="stateChangeDialog.hide(); #{collisionManager.followupExceededCollisionsShown ? 'explorerBlocker.show();' : 'explorerBlocker.hide();' }"
oncomplete="stateChangeDialog.hide(); if ( #{collisionManager.followupExceededCollisionsShown} ){ explorerBlocker.show(); } else { explorerBlocker.hide(); }"

状态更改对话框一直处于关闭状态,但上面的逻辑并没有启动

我一定是在制造一些内在的错误。我怀疑单击"确定"按钮的非完整EL表达式时不会重新求值。将@this添加到更新列表不会更改任何内容。

                 update="@this :explorer-form:tree :collision-form:period-grid :collision-form:list :collision-form:growl"
  1. 如何最好地解决我的问题,其中"最佳"首先是JSF,然后是PrimeFaces特定的(理想情况下,这是有文档记录的!)。

  2. 是否可以将blockUI blocked="#{?}"属性与EL一起使用?

感谢

一种方法是从托管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> 

相关内容

  • 没有找到相关文章

最新更新