2012-07-15 44 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" />