Я изучаю 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? Использую ли я ее неправильно? Спасибо.
Благодарим вас за ответ. Как я спросил в вопросе, он не работает ожидаемым образом. Он вызывает все остальные valueChangeListener, даже если значение столбца не было изменено. Я не могу использовать функцию edit dataTable, так как мне также нужно старое значение для целей аудита. – Damon
Итак, метод слушателя вызван для каждой записи в datatable, независимо от указанного значения, измененного или нет? Вы можете получить оба значения с помощью CellEditEvent, старого и нового. Я уверен, что вы можете сделать то же самое с помощью RowEditEvent. – chaeschuechli
Итак, метод слушателя вызван для каждой записи в datatable, независимо от указанного значения, измененного или нет? - Да, он вызван для каждой записи. Я должен подробно посмотреть на CellEditEvent на RowEditEvent. Но только для перспективы знания, я хотел бы понять основную причину проблемы, с которой я столкнулся при реализации valueChangeListener. здесь каждая запись означает в моем случае столбец «title» и «First Name», поэтому я изменяю значение заголовка и отправлю форму. Он вызывает как titleChangeListener, так и firstNameChangeListener. – Damon