2013-05-24 11 views
5

Il mio obiettivo è ottenere la larghezza dello schermo, l'altezza, ecc. In un bean di sessione in JSF. Secondo gli esempi che ho trovato, il modo per farlo è aggiungere un parametro a un comandoButton con un valore che è javascript. Il valore viene quindi trasferito alla variabile assignTo bean. Si suppone che l'attributo noEscape faccia in modo che il valore venga passato al posto del nome della variabile.Passaggio dei valori JavaScript a Bean con a4j: param

Questo funziona quasi. Quello che sta succedendo è che il nome della variabile letterale, ad es. "screen.height" si conclude nel bean invece di un numero, ad es. 600. Ho provato a cambiarlo in modo che chiami una funzione di script, ma questo non ha aiutato. (Nota, ho inserito i param all'interno di un comando command perché gli esempi l'hanno mostrato in questo modo e questo pulsante è un posto comodo ed è comunque necessario per l'app).

Ho il seguente codice di

<h:commandButton value="Log In" action="#{loginBean.login}" styleClass="buttons"> 
    <a4j:param name="w" value="getWidth()" assignTo="#{browser.screenWidth}" noEscape="true" /> 
    <a4j:param name="h" value="screen.height" assignTo="#{browser.screenHeight}" noEscape="true" /> 
    <a4j:param name="a" value="navigator.userAgent" assignTo="#{browser.userAgent}" noEscape="true" /> 
</h:commandButton> 

dove

<script> 
    function getWidth() { 
    return screen.width; 
    } 
</script> 

Anche in questo caso, il problema specifico è che sto ricevendo i nomi delle variabili nel fagiolo, non i valori delle variabili. Qualsiasi aiuto sarebbe molto apprezzato.

risposta

6

Il metodo non può funzionare poiché il valore a4j:param non viene valutato in JavaScript se utilizzato con plain h:commandButton. Devi invece usare lo a4j:commandButton.

<a4j:commandButton value="Log In" action="#{loginBean.login}" styleClass="buttons"> 
    <a4j:param name="w" value="getWidth()" assignTo="#{browser.screenWidth}" noEscape="true" /> 
    <a4j:param name="h" value="screen.height" assignTo="#{browser.screenHeight}" noEscape="true" /> 
    <a4j:param name="a" value="navigator.userAgent" assignTo="#{browser.userAgent}" noEscape="true" /> 
</a4j:commandButton> 

Un'altra soluzione èa4j:jsFunction, con questo si sarà in grado di inviare i vostri valori JavaScript al fagiolo.

Vista Codice: codice

<a4j:jsFunction name="login" action="#{loginBean.login}"> 
    <a4j:param name="screenWidth" assignTo="#{loginBean.screenWidth}" /> 
    <a4j:param name="screenHeight" assignTo="#{loginBean.screenHeight}" /> 
    <a4j:param name="userAgent" assignTo="#{loginBean.userAgent}" /> 
</a4j:jsFunction> 

<input type="button" onclick="login(screen.width,screen.height,navigator.userAgent);" /> 

Bean:

@ManagedBean 
@ViewScoped 
public class TestJavaScriptActions 
{ 
    private Integer m_iScreenWidth; 
    private Integer m_iScreenHeight; 
    private String m_sUserAgent; 

    public void setScreenWidth(Integer p_iScreenWidth) 
    { 
     m_iScreenWidth = p_iScreenWidth; 
    } 

    public Integer getScreenWidth() 
    { 
     return m_iScreenWidth; 
    } 

    public void setScreenHeight(Integer p_iScreenHeight) 
    { 
     m_iScreenHeight = p_iScreenHeight; 
    } 

    public Integer getScreenHeight() 
    { 
     return m_iScreenHeight; 
    } 

    public void setUserAgent(String p_sUserAgent) 
    { 
     m_sUserAgent = p_sUserAgent; 
    } 

    public String getUserAgent() 
    { 
     return m_sUserAgent; 
    } 

    public void login() 
    { 
     System.out.println(getScreenWidth() + ", " + getScreenHeight() + ", " + getUserAgent()); 
    } 
} 

Nota:

ho preso la latitudine di spostare ogni getter/setter all'interno del lo stesso fagiolo dell'azione per semplicità, anche chang e il h:commandButton al semplice pulsante input.

Maggiori informazioni:

+0

Grazie. Questo risolve il mio problema. Non so bene quanto mi sia sfuggita la parte h vs a4j. – wjr

+0

@ user2418375 Contento che abbia aiutato, non dimenticare di contrassegnare come accettato! –

Problemi correlati