valueChangeListener вызывает каждый столбец с данными, а не только измененный столбец

Я изучаю JSF и понимаю, как работает valueChangeListener. Я пытаюсь использовать его внутри dataTable. Цель использования valueChangeListener здесь: я хочу отслеживать изменения, которые пользователь выполняет в столбцах «Название» и «Имя».

Пожалуйста, найдите ниже код:

<p:dataTable var="tempVar"
                        value="#{tempView.tempVO}">
                        <p:column>
                            <h:outputLabel value="Academic Title:" />
                            <p:inputText value="#{tempVar.title}"
                                style="margin-left:10px;margin-top:20px;width:140px;height:25px"
                                valueChangeListener="#{tempView.titleChangeListener}">
                                <f:attribute name="TITLE" value="TITLE" />
                            </p:inputText>

                            <br />


                            <h:outputLabel value="First Name:" />
                            <p:inputText value="#{tempVar.firstName}"
                                style="margin-left:35px;margin-top:20px;width:140px;height:25px"
                                valueChangeListener="#{tempView.firstNameChangeListener}">
                                <f:attribute name="FIRST_NAME"
                                    value="FIRST_NAME" />
                            </p:inputText>
                 <p:column>
    </p:dataTable>

Бин-код

@PostConstruct
    public void init() {

        try {
            tempVO = tempService
                    .fetchDataFromDatabase(tmpDataBean
                            .tempId());

            System.out.println("success");
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
    public void titleChangeListener(ValueChangeEvent event) {

        String title = (String) ((UIInput) event.getSource()).getAttributes()
                .get("TITLE");

        System.out.println(title);

    }

    public void firstNameChangeListener(ValueChangeEvent event) {

        String firstName = (String) ((UIInput) event.getSource())
                .getAttributes().get("FIRST_NAME");
        System.out.println(firstName);
    }

Проблема, с которой я сталкиваюсь, заключается в том, что valueChangeListener вызывается для всех столбцов базы данных. Например, если я меняю только заголовок, он также вызывает имя valueChangeListener. В ответе, предоставленном @BaluC по этим ссылкам, говорится, что его следует вызывать только при изменении значения. [Когда использовать valueChangeListener или прослушиватель f:ajax?

[1]: Когда использовать прослушиватель valueChangeListener или прослушиватель f:ajax? Может ли кто-нибудь помочь понять, как работает valueChangeListener, я использую его неправильно? Спасибо.


person Damon    schedule 18.07.2016    source источник


Ответы (2)


valueChangeListener будет вызываться при изменении значения и отправке формы.

Вы хотите отредактировать указанную запись, соответственно, несколько строк в вашей таблице данных? Зачем делать это самостоятельно, а не использовать режим редактирования Primefaces?

http://www.primefaces.org/showcase/ui/data/datatable/edit.xhtml

Надеюсь, это поможет!

person chaeschuechli    schedule 18.07.2016
comment
Спасибо за ответ. Как я уже задавал вопрос, это не работает ожидаемым образом. Он также вызывает все остальные значения valueChangeListener, даже если значение столбца не было изменено. Я не могу использовать функцию редактирования dataTable, так как мне также нужно старое значение для целей аудита. - person Damon; 18.07.2016
comment
Таким образом, метод слушателя вызывался для каждой записи в таблице данных, независимо от того, было ли изменено указанное значение или нет? Вы можете получить оба значения по CellEditEvent, старое и новое. Я почти уверен, что вы могли бы сделать то же самое с помощью RowEditEvent. - person chaeschuechli; 18.07.2016
comment
Таким образом, метод слушателя вызывался для каждой записи в таблице данных, независимо от того, было ли изменено указанное значение или нет? Да, он вызывался для каждой записи. Я должен подробно изучить CellEditEvent и RowEditEvent. Но только с точки зрения знаний, я хотел бы понять основную причину проблемы, с которой я столкнулся при реализации valueChangeListener. здесь каждая запись означает в моем случае заголовок столбца и имя, поэтому я меняю значение заголовка и отправляю форму. Он вызывает как titleChangeListener, так и firstNameChangeListener. - person Damon; 18.07.2016

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

person Damon    schedule 28.07.2016