从JavaScript传递参数到p:remoteCommand

Raj*_*pta 48 javascript parameters jsf primefaces remotecommand

我想remoteCommand从javascript 传递价值.如果可以的话,我怎么能这样做,如何在支持bean中接收它们?

Bal*_*usC 82

对的,这是可能的.如何做到这一点取决于PrimeFaces版本.您可以在PrimeFaces用户指南中看到它. PrimeFaces 3.3版之前,语法如下(从3.2用户指南中复制):

3.80 RemoteCommand

...

传递参数

远程命令可以通过以下方式发送动态参数;

increment({param1:'val1', param2:'val2'});

它通过常规方式在支持bean中提供.例如,在请求范围的bean中:

@ManagedProperty("#{param.param1}")
private String param1;

@ManagedProperty("#{param.param2}")
private String param2;
Run Code Online (Sandbox Code Playgroud)

或者在更广泛的范围豆的方法中:

Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
String param1 = params.get("param1");
String param2 = params.get("param2");
Run Code Online (Sandbox Code Playgroud)

然而,这种方法的缺点在于,您无法使用普通HTML表单和HTTP请求参数(例如在多个选择下拉列表和多选复选框组中使用的现实世界中)来指定具有多个值的单个参数.


PrimeFaces版本3.3开始,语法如下(从3.3用户指南中复制):

3.81 RemoteCommand

...

传递参数

远程命令可以通过以下方式发送动态参数;

increment([{name:'x', value:10}, {name:'y', value:20}]);

这种方式可以在单个参数名称上指定多个值.具有上述单个值的参数可以使用与旧方法相同的方式:

@ManagedProperty("#{param.x}")
private int x;

@ManagedProperty("#{param.y}")
private int y;
Run Code Online (Sandbox Code Playgroud)

(注意:你可以Integer在Mojarra中使用,但不能在MyFaces中使用,这是完全无关的<p:remoteCommand>)

或者在更广泛的范围豆的方法中:

Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
int x = Integer.valueOf(params.get("x"));
int y = Integer.valueOf(params.get("y"));
Run Code Online (Sandbox Code Playgroud)

如果需要指定具有多个值的参数,则可以按如下方式执行:

functionName([{name:'foo', value:'one'}, {name:'foo', value:'two'}, {name:'foo', value:'three'}]);`
Run Code Online (Sandbox Code Playgroud)

在请求范围内的bean:

@ManagedProperty("#{paramValues.foo}")
private String[] foos;
Run Code Online (Sandbox Code Playgroud)

或者在更广泛的范围豆的方法中:

Map<String, String[]> paramValues = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterValuesMap();
String[] foos = paramValues.get("foo");
Run Code Online (Sandbox Code Playgroud)

更新

访问现代CDI JSF中的参数可以以不同的方式完成,在此Stackoverflow Q/A中进行概述


Joe*_*ard 58

页:

<p:remoteCommand name="command" action="#{bean.method}" />
Run Code Online (Sandbox Code Playgroud)

JavaScript的:

command({param: 'value'});
Run Code Online (Sandbox Code Playgroud)

豆:

public void method() {
    String value = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("param");
}
Run Code Online (Sandbox Code Playgroud)

  • 这不再起作用,请参阅 Primefaces 3.3+ 的 BalusC 答案。 (3认同)
  • @GrégoireColbert和@Joel,有可能只写"``action ="#{bean.method(param.param)}"```.地图```param```是```FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap()```的EL表示. (2认同)

Cag*_*ici 25

remoteCommandFunctionName({name1:'value1', name2:'value2'});
Run Code Online (Sandbox Code Playgroud)

  • 我如何在remoteCommand中接收/使用它?谢谢! (7认同)
  • 由于3.3参数传递格式是your_command([{name:'x',value:10},{name:'y',value:20}]); (5认同)

Jon*_*n L 8

将@BalusC @ Joel的帖子结合起来作为一个功能性的例子

<h:form>
    <p:remoteCommand name="rcName" update="msgs" actionListener="#{remoteCommandView.beanMethod}" />
    <p:growl id="msgs" showDetail="true" />

    <p:commandButton type="button" onclick="rcName([{name:'model', value:'Buick Encore'}, {name:'year', value:2015}]);" value="Pass Parameters 1" /><br/>
    <p:commandButton type="button" onclick="clicked();" value="Pass Parameters 2" />
</h:form>

<script type="text/javascript">
    //<![CDATA[
    function clicked(){
        rcName([{name:'model', value: 'Chevy Volt'}, {name:'year', value:2016}]);
    }
    //]]>
</script>
Run Code Online (Sandbox Code Playgroud)