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

Ism*_*a90 8 javascript jsf parameter-passing

我想知道如何将JSF托管bean属性传递给JavaScript函数.

像这样的东西:

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

Bal*_*usC 21

这并不是JSF变量的"传递".这只是打印JSF变量,就像它们是JavaScript变量/值一样.你知道,JSF和JS根本没有同步运行.JSF在webserver中运行并生成HTML/CSS/JS代码,这些代码一旦到达那里就会在webbrowser中运行.

您的具体问题很可能是因为您以生成无效JS语法的方式编写JSF代码.一种简单的方法来验证是通过检查JSF生成的HTML输出,您可以通过右键单击,浏览器中的查看源,以及检查您是否在浏览器的JS控制台中看不到任何语法错误报告在Chrome/IE9 +/Firefox23 +中按F12查找.

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

<a onclick="actualizaMenu(#{entity.key})">#{entity.nombre}</a>
Run Code Online (Sandbox Code Playgroud)

打印一个Java字符串变量"foo",然后生成的HTML看起来像

<a onclick="actualizaMenu(foo)">some name</a>
Run Code Online (Sandbox Code Playgroud)

但是,嘿,看,这代表一个名为JavaScript的变量foo,而不是JS字符串值!所以,如果你真的想最终结束

<a onclick="actualizaMenu('foo')">some name</a>
Run Code Online (Sandbox Code Playgroud)

那么你应该指示JSF生成那个HTML:

<a onclick="actualizaMenu('#{entity.key}')">#{entity.nombre}</a>
Run Code Online (Sandbox Code Playgroud)

但请注意JSF变量中的特殊字符.您可以使用OmniFaces of:escapeJS()功能.


具体问题无关,具体实施actualizaMenu()毫无意义.您似乎正在尝试设置bean属性.你不应该使用JS,而是使用JS <h:commandLink>.

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

必要时嵌套a <f:ajax>以使其异步.