2013-03-14 14 views
5

voglio richiamare un metodo attraverso un link da Facelets:commandLink non invoca l'azione ascoltatore, ma commandButton funziona bene

codice

mio Facelets è come:

<h:commandButton value="A" actionListener="#{customerData.searchedCustomerListA}" /> 

<h:commandLink value="A" actionListener="#{customerData.searchedCustomerListA}"/> 

codice backing bean è come:

public void searchedCustomerListA(ActionEvent ae){ 
    customerName = "A"; 
    leftCustomerListAvailable.clear(); 
    if(customerDataBean.getSearchedCustomerList(customerName)!= null) 
     leftCustomerListAvailable =customerDataBean.getSearchedCustomerList("A"); 
} 

Lo stesso codice funziona per <h:commandButton> ma non funziona per <h:commandLink>. Come è causato e come posso risolverlo?

+0

Si vede qualche errore nella console JavaScript nel browser quando si fa clic su 'commandLink'? – partlov

+0

Prova a usare 'action' invece di' actionListener'. – pepuch

+0

Ciao, ho provato anche con l'azione, ma non ho ottenuto il risultato. –

risposta

0

Prova questo, Questo potrebbe funzionare.

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:p="http://primefaces.org/ui"> 

<h:form> 

    <h:commandLink type="button" action="#{testBean.tsetLink}"> 
      <h:outputText value="A" /> 
    </h:commandLink> 

</h:form> 
</html> 

ManagedBean

@ManagedBean 
@RequestScoped 
public class TestBean { 

    public void tsetLink(){ 
    System.out.println("Link clicked!!!!!!!!!!!!"); 
    } 
} 
+0

Ciao neni, ho provato con la tua soluzione. Ma ancora non ottiene il risultato. inoltre ho provato l'azione invece di actionListener. ma il risultato è lo stesso. –

+0

è un problema con la versione JSF? –

+0

Quale versione di JSF stai usando? Stai usando librerie di componenti come primefaces, facce ricche? – neni

3

La differenza tecnica tra <h:commandLink> e <h:commandButton> è che il collegamento utilizza JavaScript per inviare il form padre. Quindi se non funziona mentre un pulsante sintatticamente equivalente funziona bene, allora questo può significare solo che JavaScript è disabilitato nel browser, o che il file jsf.js che contiene le funzioni di supporto obbligatorie non è incluso nella pagina (che dovresti facilmente ho notato vedendo errori JS nella console JS del set di strumenti per sviluppatori incorporato nel browser).

Così, per risolvere questo problema, è necessario verificare se JS è abilitato nel browser e che hai un componente <h:head> invece del semplice HTML <head> nel modello, in modo che JSF sarà in grado di auto-includere il jsf.js file.

Oppure, se i requisiti aziendali dell'applicazione richiedono che l'applicazione funzioni come progettato con JS disabilitato, è necessario attenersi a <h:commandButton> e inserire alcuni CSS per farlo apparire come un collegamento (ad esempio rimuovere sfondo, riempimento, bordo, inserto, ecc.).

0

Ho riscontrato anche questo stesso problema. Ho capito che commandLink non funzionerà quando c'è un commandButton nella stessa forma. Quando sposto il comando link su un altro modulo, è possibile richiamare l'azione come al solito. Un approccio alternativo è l'attributo immediato = "true" a commandLink.

<h:form> 
…… 
<div class="control-group"> 
    <div class="controls"> 
     <h:commandButton value="Login" action="#{usrCtrl.login}" class="btn btn-primary"/> 
     <h:commandLink action="#{usrCtrl.register}" value="test" immediate="true"/> 
    </div> 
</div> 
</h:form> 

Leggi JSF and the “immediate” Attribute – Command Components per capire perché funziona.

Problemi correlati