我正在学习JSF,并且对valueChangeListener的工作方式有一个理解问题。我正在尝试在数据表中使用它。在这里使用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 listener?
[1]:何时使用 valueChangeListener 或 f:ajax 监听器? 有人可以帮助理解valueChangeListener的工作方式,我是否以错误的方式使用它?谢谢。
当值更改并且表单提交时,将调用valueChangeListener
。
是否要在数据表中分别编辑指定的多行记录?为什么自己做而不是使用Primefaces编辑模式?
http://www.primefaces.org/showcase/ui/data/datatable/edit.xhtml
希望对您有所帮助!
终于能够解决问题了。 valueChangeListener 正在按预期的方式工作,问题出在列表中的数据上。 如果某些列的数据为 null,并且您提交表单,则 null 在内部转换为空字符串,并且 valueChangeListener 将其视为更改,因此调用了方法。