2012-04-08 8 views
0

Ich habe zwei Oberflächenteile in einer Form.Zwei Primefaces Panel in der gleichen Form kann nicht geschlossen werden über Javascript nacheinander

<p:panel id="pnlOne" widgetVar="pnlOne"> <p:ajax event="close" listener="#{createProduct.cancelAddProductCategory}"/></p:panel>' 
<p:panel id=pnlTwo" widgetVar="pnlTwo"> <p:ajax event="close" listener="#{createProduct.cancelAddBrand}"/></p:panel> 

Ich habe eine andere Befehlsschaltfläche, die die Panel-Close-Funktion auf seinem Oncomplete-Attribut aufrufen wird.

<p:commandButton id="btnadd" value="#{bundle.LabelSave}" update=":forminput :formcollector" 
action="#{createProduct.createNew}" oncomplete="handleComplete(xhr, status, args)"> 

Ich legte den Erfolg Callback-Parameter in der Backing-Bean wie folgt;

RequestContext.getCurrentInstance().addCallbackParam("success", true); 

Und die JavaScript-Funktion handleComplete wie unten;

function handleComplete(xhr, status, args) { 
if(args.success) { 
    pnlOne.close(); 
    pnlTwo.close(); 
    } } 

Das Problem ist nur eines dieser beiden Panel kann geschlossen werden. Mein Zweck ist es, beide nacheinander zu schließen. Aber es funktioniert nicht. Könnte es sein, weil die erste enge Ausführung im Javascript eine Ajax-Anfrage auslöst, die Ajax-Anfrage nicht bis zum zweiten Panel-Abschluss abgeschlossen hat? Irgendeine Idee Jungs. Ihre Hilfe wird sehr geschätzt.

Antwort

0

So lösen Sie dies. Wenn das Bedienfeld vom Benutzer nicht angezeigt wird und das Schließen der Methode für dieses unsichtbare Feld aufgerufen wird, wird das obige Szenario erstellt. Also füge ich einfach hinzu.

Wenn die Methode in meiner Bohne erfolgreich zu sein und beide Platten werden angezeigt:

RequestContext.getCurrentInstance().addCallbackParam("success", true);  
if (pnl1 is visible) { 
    RequestContext.getCurrentInstance().addCallbackParam("pnlone", true); 
} 
if (pnl2 is visible) { 
    RequestContext.getCurrentInstance().addCallbackParam("pnltwo", true); 
} 

JavaScript:

function handleComplete(xhr, status, args) { 
    if(args.success) { 
     if (args.pnlone) { 
      pnlOne.close(); 
     } 
     if (args.pnltwo) { 
      pnlTwo.close(); 
     } 
    } 
} 
1
  1. setzten die Sichtbarkeit der beiden Platten auf "# {createProduct.showPanel}"

  2. Aktualisierung des showPanel auf wahr oder falsch in der createProduct Bohne.

  3. Für die Befehlsschaltfläche, haben Sie ein Update auf beiden Panels.

+0

Dank Lumpen. Ich habs. – frazkok