2012-05-17 13 views
22

E 'possibile aggiornare un componente PrimeFaces da javascript in modo che sia forzato ad aggiornare?Come attivare l'aggiornamento del componente da javascript in primefaces?

Sto effettuando una chiamata di salvataggio ajax utilizzando questo pulsante in una finestra di dialogo. Ho allegato il mio javascript personalizzato sull'evento non completo.

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

.. durante il salvataggio del pulsante, sto aggiungendo un messaggio qui per visualizzarlo al client utilizzando il componente growl.

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

} 

Il mio problema è, come posso sequenziare l'interfaccia utente in modo tale che, dovrei nascondere la finestra di dialogo prima prima che il componente ringhio potrebbe mostrare il meesage?

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

Quello che sta succedendo è che la componente ringhio viene visualizzata accanto al dialogo, allo stesso tempo.

Grazie.

+0

È necessario visualizzare la finestra di dialogo con un clic del pulsante. Hai provato l'aggiornamento di growl da quel pulsante piuttosto che dal pulsante Salva nella finestra di dialogo? – rags

risposta

4

si può sempre fare qualcosa di simile (rimuovere lo ShowMessage id dal salvare attributo aggiornamento pulsante)

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

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

EDIT Ma comunque nel codice attuale, non è la finestra di dialogo viene chiusa alla stesso tempo in cui il grwol viene aggiornato?

+0

Vuoi dire che un pulsante "fittizio" è necessario per questo e questo non può essere realizzato attraverso qualche javascript API? Se questo è il caso, mi chiedevo di seguire questo link http://forum.primefaces.org/viewtopic.php?f=3&t=18190&view=previous. Dal momento che tutto è aaxificato, allora dovrei attivare i messaggi dal lato client stesso. La mia comprensione è corretta? –

+0

ma nel tuo caso vuoi inviare un messaggio dal server, non da js ... sul mio approccio ... immagino ci siano altri modi ... ma questo è il modo in cui trigger "re rendering" dell'elemento jsf da js :) – Daniel

+0

oh hai ragione. Ho rimosso lo showmessage dalla lista degli aggiornamenti in quanto questo mostrerebbe automaticamente il messaggio faccia. Lasciatemi provare a spiegare ulteriormente, facendo clic sul pulsante Salva, ho messo in coda il messaggio di face. Poiché l'aggiornamento automatico del ringhio è falso, il messaggio non verrà visualizzato. Questo è lo scopo della funzione javascript oncomplete. Quello che succede è che vorrei nascondere prima la finestra di dialogo, quindi vorrei che il ringgrale si aggiornasse e mostrasse il mio messaggio in coda. È possibile? –

0

Perché non riesci a inserire p: Finestra di dialogo all'interno di < h: panelGroup>. come

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

valore booleano che dovrebbe essere impostato nel metodo di salvataggio. impostando questo come falso nel metodo di salvataggio non verrà visualizzato durante l'aggiornamento. Verrà visualizzato solo il messaggio growl. Ma prima di chiamare questo metodo di salvataggio questo valore booleano è impostato su true.

+0

Non vedo come questo risolva il problema particolare dell'OP. – BalusC

44

Per questo è possibile utilizzare <p:remoteCommand> di PrimeFaces.

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

che deve essere addotti come

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

In questo caso particolare c'è però un modo più semplice. Impostare l'attributo autoUpdate di <p:growl> a true.

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

Si aggiornerà automaticamente su ogni richiesta Ajax. Se il tuo componente in realtà non lo supporta, puoi sempre copiarlo in un <p:outputPanel> che supporta anche quell'attributo.

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

Solo una FYI se il lettore utilizza una versione Jurassic di PF, l'aggiornamento automatico di growl è disponibile solo da 3.0 e versioni successive. http://blog.primefaces.org/?p=1164 – Mindwin

2

Il mio consiglio:

  1. Usa <p:remoteCommand> con un attributo actionListener.Questo attributo richiama un metodo di backing bean che contiene FacesContext.addMessage codice, in questo modo: <p:remoteCommand actionListener="myBean.testMethod()" />
  2. successiva, nello script handleSaveNewMember, richiamare l'attributo remoteCommandname dopo addMemberDlg.hide(); in questo modo: <p:remoteCommand name="testScript" actionListener="myBean.testMethod()"/>. Poi, function handleSaveNewMember(xhr, status, args) { addMemberDlg.hide(); testScript(); }
  3. Add update attributo per remoteCommand indicando componente ringhio: <p:remoteCommand name="testScript" actionListener="myBean.testMethod()" update="showmessage" />
  4. tuo commandButton è OK.

Questo ha funzionato per me.

Saluti.

0

È possibile utilizzare un elemento PrimeFaces denominato p: remotecommand. Questo elemento eseguirà un'azione (per chiamare un metodo bean, ad esempio) e per eseguire un aggiornamento dopo tale azione.

C'è un esempio in questo post http://devdublog.blogspot.com/2015/04/best-way-for-calling-method-of.html.

+0

Le risposte dovrebbero generalmente contenere un contesto, non solo un collegamento. Questo sarebbe più adatto come commento alla domanda. Vedi: http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers –

+1

Grazie per il tuo suggerimento. Ho modificato il commento per soddisfare questa funzione. – Gaalvarez

Problemi correlati