Передать параметр в p: remoteCommand из JavaScript - PullRequest
44 голосов
/ 28 августа 2011

Я хочу передать значение remoteCommand из JavaScript.Если это возможно, как я могу это сделать и как я могу получить их в бобе поддержки?

Ответы [ 7 ]

79 голосов
/ 29 августа 2013

Да, это возможно. Как это сделать, зависит от версии PrimeFaces. Вы можете увидеть это в Руководстве пользователя PrimeFaces . До PrimeFaces версии 3.3 синтаксис выглядит следующим образом (скопировано из руководства пользователя 3.2):

3,80 RemoteCommand

...

Передача параметров

Удаленная команда может отправлять динамические параметры следующим образом;

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

Он доступен в компоненте поддержки обычным способом. Например. в запросе bean-объекта:

@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");

Однако у этого подхода был недостаток, заключающийся в том, что нельзя указывать один параметр с несколькими значениями, как это возможно с обычными формами 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;

(примечание: вы можете использовать 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"));

Если вам нужно указать параметр с несколькими значениями, вы можете сделать это следующим образом:

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

с бобом в запросе:

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

или в методе боба с более широкой областью применения:

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

Обновление

Доступ к параметрам в современном CDI JSF, может быть выполнен по-другому, обрисуйте в этот Stackoverflow Q / A

57 голосов
/ 22 мая 2012

Страница:

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

JavaScript:

command({param: 'value'});

Боб:

public void method() {
    String value = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("param");
}
23 голосов
/ 28 августа 2011
remoteCommandFunctionName({name1:'value1', name2:'value2'});
8 голосов
/ 16 марта 2016

Объедините @BalusC @ пост Джоэла для функционального примера

<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 голосов
/ 14 июня 2013

Когда вам нужно передать более одного параметра из JavaScript, синтаксис:

<br />var <b>param1</b> = ...;<br />var <b>param2</b> = ...;<br />var <b>param3</b> = ...;</p> <p>remoteCommandFunction([{name:'param1', value:<b>param1</b>}, {name:'param2',value:<b>param2</b>}, {name:'param3',value:<b>param3</b>}]);

3 голосов
/ 03 марта 2015

Если вы хотите вызвать свою собственную функцию, например.В диалоговом окне подтверждения ваша пользовательская функция должна соответствовать стилю передаваемого параметра.Например:

   <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}" />
1 голос
/ 27 марта 2017

PrimeFace 5.0, динамический массив (вся ширина столбца таблицы будет отправлена ​​этим методом)

Ширина

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

р: remoteCommand

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

JS

<script type="text/javascript">
        function updateTableColumnsWidth () {
                var columnsCount = document.getElementById('table').rows[0].cells.length;

                var json = [];

                for (var i = 0; i &lt; columnsCount; i++) {
                    json[i] = { name: i, value: document.getElementById('table').rows[0].cells[i].offsetWidth};

                }

                console.log(json);
                remoteCommand(json);
            };
    </script>
...