将参数从 JavaScript 传递给 p:remoteCommand

IT技术 javascript jsf primefaces parameters remotecommand
2021-01-19 00:41:09

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

6个回答

对的,这是可能的。如何做到这一点取决于 PrimeFaces 版本。您可以在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;

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

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

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

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

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

在请求范围的 bean 中:

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

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

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

PrimeFaces 3.2 或更高版本

PrimeFaces 3.3 版之前,语法如下(复制自 3.2 用户指南):

3.80 远程命令

...

传递参数

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

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 2.1,但建议的解决方案对我不起作用。我在这里写了问题stackoverflow.com/questions/63819389/...有人能告诉我我做错了什么吗?
2021-03-15 00:41:09
大声笑,我需要从 js 传递 string[] 数组,唯一的方法是一一设置所有参数?你能展示那个样本吗?无论如何+1这个答案:)
2021-04-03 00:41:09

页:

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

JavaScript:

command({param: 'value'});

豆角,扁豆:

public void method() {
    String value = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("param");
}
@geceo 我有一段时间没有使用 JSF,但我想应该可以实现一个实用程序,它允许您编写类似action="#{bean.method(Utility.getParam("param"))}".
2021-03-20 00:41:09
@GrégoireColbert 和 @Joel,这是可能的,只要写action="#{bean.method(param.param)}". 地图param是 的 EL 表示FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap()‌
2021-03-25 00:41:09
谢谢你这么简单的回答!不幸的是,似乎无法定义action="#{bean.method(param)}",这将避免FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("param")在 bean 中调用
2021-04-06 00:41:09
这不再起作用,请参阅 Primefaces 3.3+ 的 BalusC 答案。
2021-04-10 00:41:09
remoteCommandFunctionName({name1:'value1', name2:'value2'});
您不会收到 remoteCommand 中的值,您只需使用另一个可以告诉 remoteCommand 更新的组件。您使用 p:remoteCommand 使用您想要的新值在支持 bean 中设置字段,然后将 p:remoteCommand 的 update="component2" 属性设置为指向第二个组件,然后设置第二个组件的值通过添加 value="#{myBean.value}" 来调用 bean 中更新的字段。
2021-03-21 00:41:09
由于 3.3 参数传递格式是 your_command( [ {name:'x', value:10}, {name:'y', value:20} ] );
2021-03-28 00:41:09
我正在使用 primefaces 3.3 及更高版本,但此修复程序不起作用。parameterMap 为 null <code>onclick="rc(([{name: 'emailInstance', value:#{notification.emailInstanceId}}))" </code>
2021-03-30 00:41:09

结合@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;
    }
}

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


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

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

@BalusC 我试过 Cagatay 的例子,但有多个参数不起作用(很奇怪,是吧?)。传递参数为 foo({name1:'value1', name2:'value2'}); 没有将参数正确发送到 RequestParameterMap,所以我尝试为每个参数指定名称和值,并将它们包装在一个数组 foo([{name:'name1', value:'value1'}, {name:'name2', value :'value2'}]);
2021-03-13 00:41:09