2012-05-17 4 views
22

Ist es möglich, eine PrimeFaces-Komponente von Javascript zu aktualisieren, so dass es notwendig wäre, sie zu aktualisieren?Wie löst man die Komponentenaktualisierung von JavaScript in Oberflächen ab?

Ich mache einen Ajax speichern Anruf mit dieser Schaltfläche in einem Dialogfeld. Ich habe mein benutzerdefiniertes JavaScript an das Ereignis oncomplete angehängt.

..während speichern Schaltfläche, ich bin hier eine Nachricht hinzufügen, um es anzuzeigen, den Client mithilfe der Komponente knurren.

public void save(ActionEvent event) { 
    FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, 
      "Successfuly Add user", "Successfuly Add user"); 
    FacesContext.getCurrentInstance().addMessage(null, message); 

} 

Mein Problem ist, wie kann ich die Benutzeroberfläche so sequenzieren, dass ich den Dialog verstecken sollte zuerst vor dem Knurren Komponente die meesage zeigen konnte?

function handleSaveNewMember(xhr, status, args) { 
    addMemberDlg.hide(); 
    //update the growl after the dialog was hidden? 
} 

Was passiert ist, dass die Komponente knurrt wird neben dem Dialog zur gleichen Zeit angezeigt.

Danke.

+0

Sie müssen den Dialog auf Knopfdruck anzeigen. Hast du versucht, das Knurren von dieser Schaltfläche anstatt von der Speichern-Schaltfläche im Dialog zu versuchen? – rags

Antwort

4

man kann immer etwas tun (entfernen Sie die Showmessage-ID aus dem Speichern-Button Attribute update)

<h:commandButton style="display:none" id="myBtn" > 
    <f:ajax render=":showmessage"/> 
</h:commandButton> 

function handleSaveNewMember(xhr, status, args) { 
    ... 
    jQuery("#myBtn").click(); 
} 

EDIT Aber wie auch immer in Ihrem aktuellen Code wird nicht der Dialog an dem geschlossen Gleichzeitig, dass der Grwol aktualisiert wird?

+0

Meinst du, ein Dummy-Button ist dafür erforderlich und dies kann nicht durch einige Javascript API erreicht werden? Wenn das der Fall ist, habe ich mich gefragt, ob ich dem Link http://forum.primefaces.org/viewtopic.php?f=3&t=18190&view=previous folgen sollte. Da alles ajaxifiziert ist, sollte ich die Nachrichten von der Client-Seite selbst auslösen. Ist mein Verständnis richtig? –

+0

aber in Ihrem Fall möchten Sie Nachricht vom Server senden, nicht von js ... über meine Vorgehensweise ... Ich denke, es gibt andere Möglichkeiten ... aber das ist, wie ich "Rendern" von JSF-Element aus js :) auslösen – Daniel

+0

oh du hast Recht. Ich habe die Showmessage aus der Update-Liste entfernen, da dies automatisch die Facesmessage anzeigen würde. Lassen Sie mich versuchen, weiter zu erklären, mit einem Klick auf die Schaltfläche Speichern, habe ich die facesmessage eingereiht. Da das Autoupdate des Growls falsch ist, wird die Nachricht nicht angezeigt. Das ist der Zweck der vollständigen JavaScript-Funktion. Was passiert, ist, dass ich zuerst den Dialog ausblenden würde, dann möchte ich, dass sich das Knurren aktualisiert und meine Nachricht in der Warteschlange anzeigt. Ist das möglich? –

0

Warum können Sie nicht p: Dialog innerhalb von < h: panelGroup>. wie

< h:panelGroup id="addUser" rendered = "boolean value " > 
    < p:dialog id="addMemberDialog" widgetVar="addMemberDlg" > 
     <!-- More Code --> 
     < p:commandButton value="Save" actionListener="#{memberManagedBean.createOrUpdate}" 
       oncomplete="handleSaveNewMember(xhr, status, args)" 
       update=":memberListForm:membersTable createupdateform :showmessage :addUser" 
       process="@form" /> 
    </p:dialog> 
< /h:panelGroup> 

Boolescher Wert, der in Ihrer Speichermethode festgelegt werden sollte. Wenn Sie dies in Ihrer Speichermethode als false festlegen, wird es während der Aktualisierung nicht angezeigt. So wird nur die Growl-Nachricht angezeigt. Bevor diese Speichermethode aufgerufen wird, wird dieser boolesche Wert als wahr gesetzt.

+0

Ich sehe nicht, wie das das spezielle Problem von OP löst. – BalusC

44

Sie können PrimeFaces '<p:remoteCommand> dafür verwenden.

<p:remoteCommand name="updateGrowl" update="showmessage" /> 

die als

<p:commandButton ... oncomplete="addMemberDlg.hide(); updateGrowl();" /> 

In dieser speziellen Fall es jedoch ist ein einfacher Weg, aufgerufen werden. Setzen Sie das autoUpdate Attribut von <p:growl> auf true.

<p:growl autoUpdate="true" life="1500" id="showmessage"/> 

Es aktualisiert sich automatisch bei jeder Ajax-Anfrage. Wenn Ihre Komponente dies nicht unterstützt, können Sie sie immer in eine <p:outputPanel> umbrechen, die auch dieses Attribut unterstützt.

<p:outputPanel autoUpdate="true"> 
    ... 
</p:outputPanel> 
+0

Nur ein Hinweis, wenn der Leser eine Jurassic-Version von PF verwendet, ist das Autoupdate von growl nur ab 3.0 verfügbar. http://blog.primefaces.org/?p=1164 – Mindwin

2

Mein Rat:

  1. Verwenden <p:remoteCommand> mit einem actionListener Attribute.Dieses Attribut ruft eine Backing Bean-Methode, die FacesContext.addMessage Code enthält, auf diese Weise: <p:remoteCommand actionListener="myBean.testMethod()" />
  2. nächste in Ihrem handleSaveNewMember Skript, rufen Sie das remoteCommandname Attribut nach addMemberDlg.hide(); auf diese Weise: <p:remoteCommand name="testScript" actionListener="myBean.testMethod()"/>. Dann function handleSaveNewMember(xhr, status, args) { addMemberDlg.hide(); testScript(); }
  3. Add update Attribut remoteCommand zeigt knurren Komponente: <p:remoteCommand name="testScript" actionListener="myBean.testMethod()" update="showmessage" />
  4. Ihre commandButton OK ist.

Das funktionierte für mich.

Grüße.

0

Sie können ein PrimeFaces-Element namens p: remotecommand verwenden. Dieses Element führt eine Aktion aus (um beispielsweise eine Bean-Methode aufzurufen) und um nach dieser Aktion ein Update auszuführen.

Es gibt ein Beispiel in diesem Beitrag http://devdublog.blogspot.com/2015/04/best-way-for-calling-method-of.html.

+0

Die Antworten sollten im Allgemeinen einen Kontext enthalten, nicht nur einen Link. Dies wäre besser als Kommentar zu der Frage geeignet. Siehe: http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers –

+1

Vielen Dank für Ihren Vorschlag. Ich habe den Kommentar bearbeitet, um diese Funktion zu erfüllen. – Gaalvarez