如何将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只是试试这个。 请求上下文