JSF属性标记内的值

时间:2012-12-10 14:28:29

标签: javascript jsf

如何将JS值传递给组件内的属性嵌套标记?

我有这段代码:

<p:remoteCommand .....>
    <f:attribute name="galaxie" value="jstest()" />
</p:remoteCommand>

我简单的JS jstest函数:

function jstest(){
    return "foo";
}

当我在支持bean中测试galaxie的属性值时,我jstest()而不是foo

1 个答案:

答案 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() });

您可以@ManagedPropertyExternalContext#getRequestParameterMap()收集。


更新:自PrimeFaces 3.3以来,<p:remoteCommand>功能中参数的语法已更改。如果你至少使用PrimeFaces 3.3,那么函数调用应如下所示:

foo([{ name: 'galaxie', value: jstest() }]);

另见Pass parameter to p:remoteCommand from JavaScript