2012-12-10 41 views
2

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

我有这样的代码:

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

而且我简单的JS jstest功能:

function jstest(){ 
    return "foo"; 
} 

当我在后台bean GALAXIE测试属性值我有jstest()foo

+0

组件的属性在服务器级别声明和设置,而不是在客户端级别。换句话说,不以这种方式将客户端值提交给服务器组件属性。你特别想要达到什么目标,因为可能有更好的方法来实现它。 –

+0

谢谢你,是的,我认为它... –

回答

5

<f:attribute>是一个JSF标记,它在生成HTML代码期间在Web服务器中运行。 JavaScript是一种客户端语言,它不能在web服务器上运行,但在检索到所有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

+0

谢谢,但我不能申请这个(我认为),因为我的'富'变量是动态的,不知道在HTML代。基本上,它是HTML选择组件(selectOneMenu)的价值。所以感谢这个组件的onchange监听器remotecommand被解雇了,我想知道这个selectOneMenu在我的backing bean中的价值。总结一下,我想这样做:http://www.primefaces.org/showcase/ui/pprPartialTree.jsf,但与remoteCommand,但它不起作用(它看起来像根据论坛有很多错误... )。所以我想通过JS –

+0

来做到这一点然后,只需要提到第一个提到的方法? – BalusC

+0

嗯我部分理解你的想法。事实上,我可以用这个“诀窍”做我想做的事。再次感谢你 ! –