2013-02-05 109 views
8

我想知道如何將JSF託管bean屬性傳遞給JavaScript函數。如何將JSF託管bean屬性傳遞給JavaScript函數?

事情是這樣的:

<script> 
    function actualizaMenu(key){ 
    #{linkedMenu.setKey(key)} 
    } 
</script> 
<ul> 
    <ui:repeat value="#{moduleList.modulos}" var="entity"> 
    <li> 
     <a onclick="actualizaMenu(#{entity.key})">#{entity.nombre}</a> 
    </li> 
    </ui:repeat> 
</ul> 

回答

20

這不正是 「過客」 JSF變量。這只是打印JSF變量,就好像它們是JavaScript變量/值一樣。你知道,JSF和JS根本不同步運行。 JSF在web服務器上運行,並生成HTML/CSS/JS代碼,然後在網頁瀏覽器中運行。

您的具體問題很可能是因爲您以這樣的方式編寫JSF代碼而導致它生成無效的JS語法。一種簡單的方法來驗證,即通過檢查JSF生成的HTML輸出,您可以在瀏覽器中右鍵點擊查看源文件,並通過檢查是否在瀏覽器中的JS控制檯中看不到任何語法錯誤報告您可以通過在Chrome/IE9 +/Firefox23 +中按F12來查找。

試想一下,#{entity.key}這裏

<a onclick="actualizaMenu(#{entity.key})">#{entity.nombre}</a> 

印像"foo" Java字符串變量,然後將生成的HTML看起來像

<a onclick="actualizaMenu(foo)">some name</a> 

但是,嘿,你看,它表示一個JavaScript 變量命名foo,不是JS字符串值!所以,如果你真的想最終落得如

<a onclick="actualizaMenu('foo')">some name</a> 

,那麼你應該指導JSF生成正是HTML:

<a onclick="actualizaMenu('#{entity.key}')">#{entity.nombre}</a> 

謹防在JSF變量的特殊字符,但。你可以使用OmniFaces of:escapeJS() function


無關到具體問題的actualizaMenu()的具體實施是沒有意義的。你似乎試圖設置一個bean屬性。您不應該使用JS,而應該使用<h:commandLink>

<h:commandLink value="#{entity.nombre}" action="#{linkedMenu.setKey(entity.key)}" /> 

如果需要,嵌套一個<f:ajax>使其異步。

1

我會建議使用事件與jQuery結合和元素的數據屬性來獲得相同的結果(假設你使用jQuery):

<script> 
    function actualizaMenu(key){ 
    /* Logic here ... */ 
    } 

    $(document).ready(function(){ 
    $('.menuItem').click(function(){ 
     var key = $(this).data('key'); 
     actualizaMenu(key); 
    ); 
    }); 
</script> 

...

<ul> 
    <ui:repeat value="#{moduleList.modulos}" var="entity"> 
    <li> 
     <a data-key="#{entity.key}" class="menuItem">#{entity.nombre}</a> 
    </li> 
    </ui:repeat> 
</ul> 

而且,作爲在其他地方指出,除非#{linkedMenu.setKey(key)}實際上會返回一段JavaScript(即使它不太可能會很糟糕,並且可能真的很糟糕),但您還需要修復該功能。

1

我知道這個問題很舊,但對於那些仍在尋找替代品的人來說。

如果您正在使用primefaces,請嘗試一下。 Request Context

相關問題