如何将JSF托pipebean属性传递给JavaScript函数?

我想知道如何将JSF托pipe的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> 

这不完全是“传递”的JSFvariables。 这只是打印JSFvariables,就好像它们是JavaScriptvariables/值一样。 你知道,JSF和JS根本不同步。 JSF运行在web服务器上,并生成HTML / CSS / JS代码,然后在网页浏览器中运行。

您的具体问题很可能是由于您以这种方式编写了JSF代码,导致它生成无效的JS语法。 一个简单的方法来validation,只是检查JSF生成的HTML输出,你可以通过右键单击查看源代码在浏览器,并检查是否没有看到任何语法错误报告在JS控制台中的浏览器,你可以在Chrome / IE9 + / Firefox23 +中按F12查找。

想象一下#{entity.key}在这里

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

打印一个像"foo"这样的Javastringvariables,然后生成的HTML将如下所示

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

但是,嘿,看,代表一个名为foo的JavaScript variables ,而不是JSstring值! 所以如果你真的想最终结束

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

那么你应该指示JSF生成正确的HTML:

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

不过要注意JSFvariables中的特殊字符。 你可以使用OmniFaces of:escapeJS()函数 。


具体问题无关actualizaMenu()的具体实现是没有意义的。 你似乎试图设置一个bean属性。 你不应该使用JS,而是使用<h:commandLink>

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

如果需要,嵌套<f:ajax>使其asynchronous。

我build议使用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(即使这种情况不太可能,也可能非常糟糕),但是还需要修复该function。

我知道这个问题很老,但对于那些还在寻找替代品的人来说。

如果你正在使用primefaces只是试试这个。 请求上下文