从JavaScript将参数传递给p:remoteCommand

从JavaScript将参数传递给p:remoteCommand,javascript,jsf,primefaces,parameters,remotecommand,Javascript,Jsf,Primefaces,Parameters,Remotecommand,我想将值从javascript传递到remoteCommand。如果这是可能的,我如何才能做到这一点,以及如何在支持bean中接收它们?页面: remoteCommandFunctionName({name1:'value1', name2:'value2'}); 豆子: 当需要从javascript传递多个参数时,语法为: var param1=var param2=var param3= remoteCommandFunction([{name:'param1',value:param1}

我想将值从javascript传递到
remoteCommand
。如果这是可能的,我如何才能做到这一点,以及如何在支持bean中接收它们?

页面:

remoteCommandFunctionName({name1:'value1', name2:'value2'});
豆子:


当需要从javascript传递多个参数时,语法为:


var param1=
var param2=
var param3=


remoteCommandFunction([{name:'param1',value:param1},{name:'param2',value:param2},{name:'param3',value:param3}])

是的,这是可能的。如何做到这一点取决于PrimeFaces的版本。你可以从中看到它

PrimeFaces 3.3或更新版本 由于PrimeFaces版本3.3,语法如下(从3.3用户指南复制粘贴)

3.81远程命令

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

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

这种方式提供了在单个参数名上指定多个值的可能性。具有上述单个值的参数可用的方法与旧方法相同:

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

@ManagedProperty("#{param.y}")
private int y;
(注意:您可以在Mojarra中使用
Integer
,但不能在MyFaces中使用,这与
完全无关)

或者使用范围更广的bean的方法:

Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
int x = Integer.valueOf(params.get("x"));
int y = Integer.valueOf(params.get("y"));
@ManagedProperty("#{paramValues.foo}")
private String[] foos;
Map<String, String[]> paramValues = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterValuesMap();
String[] foos = paramValues.get("foo");
@ManagedProperty("#{param.param1}")
private String param1;

@ManagedProperty("#{param.param2}")
private String param2;
Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
String param1 = params.get("param1");
String param2 = params.get("param2");
在请求作用域bean中使用:

Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
int x = Integer.valueOf(params.get("x"));
int y = Integer.valueOf(params.get("y"));
@ManagedProperty("#{paramValues.foo}")
private String[] foos;
Map<String, String[]> paramValues = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterValuesMap();
String[] foos = paramValues.get("foo");
@ManagedProperty("#{param.param1}")
private String param1;

@ManagedProperty("#{param.param2}")
private String param2;
Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
String param1 = params.get("param1");
String param2 = params.get("param2");
或者使用范围更广的bean的方法:

Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
int x = Integer.valueOf(params.get("x"));
int y = Integer.valueOf(params.get("y"));
@ManagedProperty("#{paramValues.foo}")
private String[] foos;
Map<String, String[]> paramValues = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterValuesMap();
String[] foos = paramValues.get("foo");
@ManagedProperty("#{param.param1}")
private String param1;

@ManagedProperty("#{param.param2}")
private String param2;
Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
String param1 = params.get("param1");
String param2 = params.get("param2");
或者使用范围更广的bean的方法:

Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
int x = Integer.valueOf(params.get("x"));
int y = Integer.valueOf(params.get("y"));
@ManagedProperty("#{paramValues.foo}")
private String[] foos;
Map<String, String[]> paramValues = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterValuesMap();
String[] foos = paramValues.get("foo");
@ManagedProperty("#{param.param1}")
private String param1;

@ManagedProperty("#{param.param2}")
private String param2;
Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
String param1 = params.get("param1");
String param2 = params.get("param2");
Map params=FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
字符串param1=params.get(“param1”);
字符串param2=params.get(“param2”);
然而,这种方法有一个缺点,即您不能像使用普通HTML表单和HTTP请求参数那样,使用多个值来指定单个参数(在现实世界中用于多选择dropdownlist和多选择checkboxgroup)


另见:

如果要调用自己的函数,例如确认对话框,则自定义函数必须符合传递参数样式。 例如:

remoteCommand标记

<p:remoteCommand name="remoteDeleteDemand" actionListener="#{myController.doDelete}" />

将@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>

PrimeFace 5.0,动态数组(所有表列宽将通过此方法发送)

光束

public void updateTableColumnsWidth(){
FacesContext context=FacesContext.getCurrentInstance();
Map Map=context.getExternalContext().getRequestParameterMap();
}
p:remoteCommand

<h:form>
     <p:remoteCommand name="remoteCommand" action="#{controller.updateTableColumnsWidth}" />
</h:form>

JS


函数updateTableColumnsWidth(){
var columnsCount=document.getElementById('table')。行[0]。单元格.length;
var json=[];
for(变量i=0;i columnsCount;i++){
json[i]={name:i,value:document.getElementById('table')。行[0]。单元格[i]。offsetWidth};
}
log(json);
远程命令(json);
};

@BalusC我尝试了Cagatay的示例,但使用了多个参数,结果都不起作用(奇怪吧?)。以foo形式传递参数({name1:'value1',name2:'value2'});没有正确地将参数发送到RequestParameterMap,因此我尝试为每个参数指定名称和值,并将它们包装在数组foo中([{name:'name1',value:'value1'},{name:'name2',value:'value2'}]);谢谢你的简单回答!不幸的是,似乎无法在bean中定义
action=“#{bean.method(param)}”
,这将避免调用
FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get(“param”)
。@geceo我已经有一段时间没有使用JSF了,但我想应该可以实现一个实用程序,它允许您编写类似于
action=“#{bean.method(utility.getParam(“param”)}”
@Grégoirecbert和@Joel的东西,只要编写
action=“#{bean.method(param.param)}”
。map
param
FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap()的EL表示‌。这不再有效,请参阅Primefaces 3.3+的BalusC答案。我相信
(remoteDelete)的JS调用(remoteDeleteDemand(id))和
属性应该匹配,不是吗?@geceo是的,它们肯定应该匹配。您没有收到remoteCommand中的值,您只需使用另一个组件,就可以告诉remoteCommand进行更新。使用p:remoteCommand在支持bean中使用所需的新值设置字段,然后将p:remoteCommand的update=“component2”属性设置为指向第二个组件,然后通过添加value=“#{myBean.value}”调用bean中更新的字段来设置第二个组件的值。因为3.3参数传递格式是您的_命令([{name:'x',value:10},{name:'y',value:20}]);我正在使用primefaces 3.3及以上版本,但此修复程序不起作用。parameterMap为null
onclick=“rc([{name:'emailInstance',value:{notification.emailInstanceId}])”
这里的第一个答案已经过时,请查看@BalusC lol的答案,我需要从js传递string[]数组,唯一的方法是逐个设置所有参数?你能给我看看那个样品吗?无论如何,对于这个答案+1:)我使用的是PrimeFaces2.1,但建议的解决方案对我不起作用。我在这里写了一个问题。有人能告诉我我做错了什么吗?