2012-07-15 42 views
1

如果我想從JavaScript內評估JSF bean屬性,我發現它在JavaScript代碼片段位於xhtml文件內時有效,但在JavaScript代碼片段不起作用在一個單獨的js文件中。未在外部JavaScript文件中評估JSF bean屬性

所以,這個工程:

的index.xhtml

... 
<h:body> 
    <script type="text/javascript" src="resources/Javascript/jquery/jquery-1.7.2.js" /> 
    <script type="text/javascript" > 
     $(document).ready(function() { 
      alert('#{myBean.myProperty}'); 
     }); 
    </script>   
</h:body> 

但這並不評估ManagedBean的財產:

的index.xhtml

... 
<h:body> 
    <script type="text/javascript" src="resources/Javascript/jquery/jquery-1.7.2.js" /> 
    <script type="text/javascript" src="resources/Javascript/MyJS.js" /> 
</h:body> 

MyJS.js

$(document).ready(function() { 
    alert('#{myBean.myProperty}'); 
}); 

在第二種情況下,警告框包含不評估串#{myBean.myProperty}

我怎樣才能使它從外部的js文件的工作?

+1

我認爲你從外部無法JS,作爲一種解決方法,你需要通過調用它像'functionName(#{value})那樣將這個值從JSF頁面傳遞給JS函數的唯一方法;'並且像JS正常值那樣在JS文件中做你想要的東西 – 2012-07-15 10:14:45

+0

謝謝,這使得很多s ense! – perissf 2012-07-15 10:18:52

+0

您也可以將.js轉換爲.jsp。 JSF API中有方法可以讓你從Java代碼中處理EL表達式。 – SJuan76 2012-07-15 10:22:21

回答

0

得益於建議由@鋁Mothafar,我終於解決了我問題的方式如下:

的index.xhtml

... 
<h:body> 
    <script type="text/javascript" src="resources/Javascript/jquery/jquery-1.7.2.js" /> 
    <script type="text/javascript" src="resources/Javascript/MyJS.js" /> 
    <script type="text/javascript" > 
     var myBeanProperty = '#{myBean.myProperty}'; 
    </script>   
</h:body> 

MyJS.js

$(document).ready(function() { 
    alert(myBeanProperty); 
}); 
+1

你真的更好開始使用' Daniel 2012-07-15 11:09:21

1

我只是想回答前要檢查什麼的,就像我在我的評論說:

我認爲你不能從外部JS,作爲一種解決方法的唯一方法,你需要傳遞價值的JS功能從JSF頁面調用它像functionName(#{value});,並做你想在JS文件中像一個正常的JS值。

就像你的index.xhtml

<script type="text/javascript" > 
     $(document).ready(function() { 
      functionName('#{myBean.myProperty}'); 
     }); 
</script> 

或類似:

<h:commandLink action="..." value="..." onclick="functionName('#{myBean.myProperty}')"/> 

,並在你的js文件:

function functionName(var1) { 
// DO what you want to do with var1 or varN like normal JS value 
} 

當然,你可以通過一個多參數不僅僅是單個參數。

2

我個人比較喜歡下面的方法

<h:inputText id="myHiddenData" value="#{myBean.myProperty}" style="display:none"> 


$(document).ready(function() { 
    alert($("#myHiddenData").val()); // or alert($("#myFormID\\:myHiddenData").val()); 
}); 

我只是不喜歡混合使用的js代碼JSF ...

+0

您*將JavaScript代碼與JSF混合在一起。你只是內聯而不是通過.js文件。這是唯一可行的方法。 JSF無法看到.js文件。 – EJP 2012-07-15 11:17:49

+1

@EJP我正在從js訪問一個傳遞給JSF的值,我不認爲它可以被稱爲「JSF混合JavaScript代碼」 – Daniel 2012-07-15 18:05:21

5

另一種解決方案是改變你的* .js文件以* .xhtml,幷包括其 「< UI:包括.../>」。爲避免解析器抱怨在您的* .xhtml文件中使用了&,<和>,請使用CDATA標記將其包圍。這樣做的缺點是,如果在其他頁面中使用* .js文件,瀏覽器將無法緩存它。

MyJS.xhtml(從MyJS.js改變)

<xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:ui="http://java.sun.com/jsf/facelets"> 

<h:body> 
<ui:composition> 

<script type="text/javascript"> 
//<![CDATA[ 
    ...your JavaScript code here... 
//]]> 
</script> 

</ui:composition> 
</h:body> 
</html> 

在你的index.xhtml文件,請執行下列操作:

<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:ui="http://java.sun.com/jsf/facelets"> 
    ... 
<ui:include src="MyJS.xhtml" />