0

Передача параметров в p:remoteCommand из JavaScript

16

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

5 ответ(ов)

0

Ваша реализация выглядит правильно, однако чтобы пакетный вызов command правильно работал и передавал параметры в метод вашего бина, нужно убедиться, что всё настроено корректно.

  1. JSF Remote Command: Ваш компонент <p:remoteCommand> с именем command действительно создаёт JavaScript-функцию, которая позволяет вызывать метод бина из JavaScript. Убедитесь, что этот командный элемент находится внутри <h:form>, чтобы у него была возможность корректно работать с контекстом JSF.

  2. Передача параметров: Когда вы вызываете command({param: 'value'}), значение param должно правильно передаваться в метод вашего бина. В это время вы корректно используете FacesContext для извлечения параметров.

Вот как это может выглядеть в контексте JSF:

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

И ваш метод в бине будет работать корректно для получения значения параметра:

public void method() {
    String value = FacesContext.getCurrentInstance().getExternalContext()
                      .getRequestParameterMap().get("param");
    // Обработка значения 'value'
}

Проверьте, вызывает ли JavaScript-функция command в правильный момент (например, по событию клика кнопки), и убедитесь, что вы не сталкиваетесь с проблемами кэширования в браузере, так как это может предотвратить корректное выполнение.

Если всё настроено верно, вы должны увидеть, что param присваивается значению, переданному из JavaScript.

0

Для вызова функции remoteCommandFunctionName с объектом в качестве аргумента, вы можете сделать это следующим образом:

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

В данном примере мы передаем объект, содержащий два свойства: name1 со значением 'value1' и name2 со значением 'value2'. Это позволяет передавать несколько значений в одну функцию, что может быть удобно для организации кода и передачи связанных данных. Убедитесь, что функция remoteCommandFunctionName правильно обрабатывает передачу объекта.

0

Вот пример того, как объединить посты @BalusC и @Joel для создания функционального примера с использованием p:remoteCommand в JSF. Код позволяет передавать параметры в бэкенд и отображать сообщения через p:growl.

Код XHTML

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

Код Java (Бэкэнд)

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.context.FacesContext;
import javax.faces.application.FacesMessage;

@ManagedBean
public class RemoteCommandView {

    // Метод для обработки вызова RemoteCommand
    public void beanMethod() {
        // Получаем параметры из запроса
        String model = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("model");
        String year = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("year");

        // Добавляем сообщение
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Executed", 
            "Использовано RemoteCommand с параметрами: модель = " + model + ", год = " + year));
    }

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

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

    public void setModel(String model) {
        this.model = model; // значение устанавливается JSF
    }

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

Объяснение

  1. HTML Форма: Форма содержит два commandButton, которые вызывают p:remoteCommand с разными параметрами. Первый передает параметры напрямую, а второй — через JS-функцию clicked().

  2. Java Бин: В бэкенде мы определяем метод beanMethod, который извлекает переданные параметры model и year из контекста лица и добавляет сообщение с информацией о выполненных действиях.

  3. Сообщения: Используя p:growl, мы можем уведомлять пользователя об успешном выполнении команды. Это улучшает взаимодействие с пользователем и дает понять, что данные были обработаны.

Эта комбинация демонстрирует, как можно эффективно передавать данные с фронтенда на бэкенд и отображать сообщения пользователям.

0

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

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

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

В этом примере мы создаем массив объектов, где каждый объект содержит имя параметра и его значение. Этот синтаксис удобен для передачи нескольких параметров в функцию remoteCommandFunction.

0

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

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

Функция на JavaScript будет выглядеть следующим образом:

function confirmDelete(id) {
    if (confirm('Вы действительно хотите удалить?')) {
        remoteDeleteDemand(id);
        return true;
    }
}

А тег remoteCommand будет таким:

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

Обратите внимание, что мы передаем массив объектов ({name:'Id', value: '#'}), который будет совместим с обработчиком. Важно правильно обрабатывать параметры внутри функции confirmDelete, чтобы они могли быть корректно переданы в вызов удаленной команды.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь