如何将JS值传递给组件内的属性嵌套标记?
我有这段代码:
<p:remoteCommand .....>
<f:attribute name="galaxie" value="jstest()" />
</p:remoteCommand>
我简单的JS jstest
函数:
function jstest(){
return "foo";
}
当我在支持bean中测试galaxie的属性值时,我jstest()
而不是foo
。
答案 0 :(得分:6)
<f:attribute>
是一个JSF标记,它在生成HTML代码时在Web服务器中运行。 JavaScript是一种客户端语言,它不在webserver中运行,但在检索完所有JSF生成的HTML代码后在webbrowser中运行。然而,您似乎期望它们“同步”运行。因此不是这样。
为了实现你的想法,你基本上需要提供绑定到bean属性的<h:inputHidden>
并让JS在远程命令请求被触发之前填充它。
E.g。
<h:form id="form">
<h:inputHidden id="galaxie" value="#{bean.galaxie}" />
<p:remoteCommand ... onstart="$('#form\\:galaxie').val(jstest())" process="@form" ... />
</h:form>
或者,更容易将其作为远程命令函数参数传递,该参数接受表示请求参数映射的JS对象。鉴于
<h:form>
<p:remoteCommand name="foo" ... />
</h:form>
你可以这样做:
foo({ galaxie: jstest() });
您可以@ManagedProperty
或ExternalContext#getRequestParameterMap()
收集。
更新:自PrimeFaces 3.3以来,<p:remoteCommand>
功能中参数的语法已更改。如果你至少使用PrimeFaces 3.3,那么函数调用应如下所示:
foo([{ name: 'galaxie', value: jstest() }]);