2013-05-24 14 views
5

Moim celem jest uzyskanie szerokości ekranu, wysokości itp. W komponencie bean sesji w JSF. Zgodnie z przykładami, które znalazłem, sposobem na to jest dodanie parametru do commandButton z wartością, która jest javascript. Wartość jest następnie przenoszona do zmiennej assignTo bean. Atrybut noEscape ma sprawić, że wartość zostanie przekazana zamiast nazwy zmiennej.Przekazywanie wartości JavaScript do Bean z a4j: param

To prawie działa. Co się dzieje, to literalna nazwa zmiennej, np. "screen.height" pojawia się w fasoli zamiast numeru, np. 600. Próbowałem go zmienić, aby wywoływał funkcję skryptu, ale to nie pomogło. (Uwaga, umieściłem parametry wewnątrz polecenia commandButton, ponieważ przykłady pokazały to w ten sposób, a ten przycisk jest dogodnym miejscem i jest tak potrzebny w przypadku aplikacji).

Mam następujący kod

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

gdzie

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

Ponownie, specyficzny problem jest to, że jestem coraz nazwy zmiennych do fasoli, a nie wartości zmiennych. Każda pomoc byłaby bardzo cenna.

Odpowiedz

6

Twoja metoda nie może działać, ponieważ wartość a4j:param nie jest oceniana w JavaScript, gdy używana jest ze zwykłym h:commandButton. Zamiast tego należy użyć wartości 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> 

Innym rozwiązaniem jest a4j:jsFunction, z tym będzie można wysłać swoje wartości JavaScript do fasoli.

Zobacz Kod: Kod

<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()); 
    } 
} 

Uwaga:

ja wziął swobodę poruszania każdą getter/setter wewnątrz ten sam komponent, co działanie dla prostoty, także chang e h:commandButton do zwykłego przycisku input.

Więcej informacji:

+0

Dzięki. To naprawia mój problem. Nie jestem do końca pewien, jak ominąłem partię h vs a4j. – wjr

+0

@ user2418375 Cieszę się, że pomogło, nie zapomnij oznaczyć jako zaakceptowany! –

Powiązane problemy