从JavaScript传递参数到p:remoteCommand

时间:2011-08-28 14:14:03

标签: javascript jsf primefaces parameters remotecommand

我想将值从javascript传递给remoteCommand。如果可以,我该怎么做?如何在支持bean中接收它们?

7 个答案:

答案 0 :(得分:78)

是的,有可能。如何做到这一点取决于PrimeFaces版本。您可以在PrimeFaces users guide中看到它。 之前 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;

或更广泛的范围bean的方法:

Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
String param1 = params.get("param1");
String param2 = params.get("param2");

然而,这种方法的缺点在于,您无法使用普通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;

(注意:您可以在Mojarra中使用Integer,但在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")); 完全无关。

或更广泛的范围bean的方法:

functionName([{name:'foo', value:'one'}, {name:'foo', value:'two'}, {name:'foo', value:'three'}]);`

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

@ManagedProperty("#{paramValues.foo}")
private String[] foos;

在请求范围内的bean:

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

或更广泛的范围bean的方法:

{{1}}

更新

访问现代CDI JSF中的参数,可以采用不同的方式完成,概述于this Stackoverflow Q/A

答案 1 :(得分:56)

页:

<p:remoteCommand name="command" action="#{bean.method}" />

JavaScript的:

command({param: 'value'});

豆:

public void method() {
    String value = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("param");
}

答案 2 :(得分:20)

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

答案 3 :(得分:7)

结合@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>
@ManagedBean
public class RemoteCommandView {
    public void beanMethod() {
        // OR - retrieve values inside beanMethod
        String model1 = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("model");
        String year1 = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("year");
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Executed", 
            "Using RemoteCommand with parameters model := " + model + ", year := " + year));
    }

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

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

    public void setModel(String model) {
        this.model = model; // value set by JSF
    }

    public void setYear(int year) {
        this.year = year;
    }
}

答案 4 :(得分:4)

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


var param1 = ...;
var param2 = ...;
var param3 = ...;

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

答案 5 :(得分:3)

如果您想调用自己的功能,例如。在确认对话框中,您的自定义函数必须符合传递参数样式。 例如:

   <p:commandLink id="myId" onclick="confirmDelete([{name:'Id', value: '#{my.id}'}]);" immediate="true">

java脚本函数

            function confirmDelete(id) {
            if (confirm('Do you really want to delete?')) {
                remoteDeleteDemand(id);
                return true;
            }

remoteCommand标签

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

答案 6 :(得分:0)

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

FindResource

号码:remoteCommand

public void updateTableColumnsWidth() {
    FacesContext context = FacesContext.getCurrentInstance();
    Map<String, String> map = context.getExternalContext().getRequestParameterMap();
}

JS

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