2016-07-18 3 views
0

Я изучаю JSF и понимаю, как работает valueChangeListener. Я пытаюсь использовать его внутри dataTable. Цель использования valueChangeListener здесь - я хочу отслеживать изменения, которые пользователь выполняет в столбце Title и First Name.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> 

Bean Код

@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 IS-вызывается для всех столбцов базы данных. Например, если я изменяю только Title, он также вызывает имя nameChangeListener. Ответ, предоставленный @BaluC по этим ссылкам, говорит о том, что его следует вызывать только при изменении значения. [When to use valueChangeListener or f:ajax listener?

[1]: When to use valueChangeListener or f:ajax listener? Не могли бы вы помочь понять, как работает функция valueChangeListener? Использую ли я ее неправильно? Спасибо.

ответ

0

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

0

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

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

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

Надежда, что помогает!

+0

Благодарим вас за ответ. Как я спросил в вопросе, он не работает ожидаемым образом. Он вызывает все остальные valueChangeListener, даже если значение столбца не было изменено. Я не могу использовать функцию edit dataTable, так как мне также нужно старое значение для целей аудита. – Damon

+0

Итак, метод слушателя вызван для каждой записи в datatable, независимо от указанного значения, измененного или нет? Вы можете получить оба значения с помощью CellEditEvent, старого и нового. Я уверен, что вы можете сделать то же самое с помощью RowEditEvent. – chaeschuechli

+0

Итак, метод слушателя вызван для каждой записи в datatable, независимо от указанного значения, измененного или нет? - Да, он вызван для каждой записи. Я должен подробно посмотреть на CellEditEvent на RowEditEvent. Но только для перспективы знания, я хотел бы понять основную причину проблемы, с которой я столкнулся при реализации valueChangeListener. здесь каждая запись означает в моем случае столбец «title» и «First Name», поэтому я изменяю значение заголовка и отправлю форму. Он вызывает как titleChangeListener, так и firstNameChangeListener. – Damon

Смежные вопросы