2013-02-18 7 views
5

Wie machen Sie PrimeFaces p: BlockUI eine bestimmte Komponente dynamisch blockieren, das ist in EL Bedingung?PrimeFaces p: BlockUI blockiert eine bestimmte Komponente dynamisch (auf JSF EL-Bedingung)?

USE CASE:

Die Bedingung bei der Hand ist im Grunde ein Modus, der Benutzer auf einer Seite sein kann: wenn es irgendwelche Kollisionen überschritten, und sie sind zur Zeit an den Benutzer fragen dann die Navigationsstruktur blockieren gezeigt (zeige überhöhten Kollisionsmodus, Navigationsbaum blockiert), ansonsten sind wir in der regulären Ansicht und der Navigationsbaum sollte entsperrt werden (zeige normalen Kollisionsmodus, nav tree unblocked).

Das Problem ist, dass, wenn in "überschritten Modus", wenn ein Statusänderungsdialog ändert den Status auf nicht überschritten, rendert/aktualisiert sich korrekt wieder in den regulären Modus, , aber der Schatten in der Navigationsstruktur ist immer noch da. Da wir uns jetzt im regulären Modus befinden, muss ich eine Möglichkeit zum Entsperren finden, wenn keine weiteren Kollisionen mehr auftreten.

Verstanden? :-)

OK, hier ist die Bean-Eigenschaft zuerst:

/* 
* 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; 
} 

1. Versuch:

http://www.primefaces.org/docs/vdl/3.4/primefaces-p/blockUI.html einige blockierte Attribut ergab sich die VDL docs suchen.

<p:blockUI widgetVar="explorerBlocker" 
       block=":explorer-form" 
       blocked="#{collisionManager.followupExceededCollisionsShown}" /> 

Das oben genannte tut jedoch absolut nichts.

2. Versuch:

in der Vitrine der Suche http://www.primefaces.org/showcase/ui/blockUI.jsf schien der Client-API mehr als ausreichend.

Die Idee war entweder show() oder ausblenden() in Abhängigkeit von einem Valueexpression zu rufen, wenn sie auf die Statusänderung Dialog mit OK:

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

Die Idee war irgendwie die OK-Taste des onComplete = „“ erweitern mit einem Anruf an explorerBlocker.show(); oder explorerBlocker.hide(); je nach dem neuen Wert der EL #{collisionManager.followupExceededCollisionsShown}.

Es gibt zwei Grundvarianten Ich habe versucht:

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

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

Die Statusänderung Dialog die ganze Zeit geschlossen ist, aber die Logik oben kickt nicht in

ich etwas von Natur aus falsch machen müssen. Hier. Ich vermute, dass die OK-Schaltfläche, wenn ein vollständiger EL-Ausdruck angezeigt wird, beim Klicken nicht erneut ausgewertet wird. Das Hinzufügen eines @ this zur Update-Liste ändert nichts.

    update="@this :explorer-form:tree :collision-form:period-grid :collision-form:list :collision-form:growl" 
  1. Wie wird mein Problem am besten gelöst, wo "beste" ist JSF-nur zuerst, dann PrimeFaces spezifische (und im Idealfall, wo dies dokumentiert ist!).

  2. Ist es möglich, den blockUI blocked = "# {?}“Mit EL-Attribut

Dank

Antwort

3

Eine Möglichkeit hide() und show() -Methode von BlockUI von Managed Bean zu nennen, ist
Sie können das tun, indem Sie Request mit:.

.

RequestContext.getCurrentInstance() ausführen ("widgetVar.show()");

Ein weiterer Grund ist die Variable t passieren kann o JavaScript-Funktion und dann lassen Sie die Javascript-Funktion das für Sie erledigen.

onClick="func(#{elvariable})" 

<script type="text/javascript"> 
function func(value) 
{ 
if(value==something){ 
widgetVar.show(); 
}else{ 
widgetVar.hide(); 
} 
} 
</script>