嗨,
请参阅下列代码:
<h:selectOneMenu id="countries" value="#{countryBean.selectedCountry}" onchange="submit()
valueChangeListener="#{countryBean.changeCountry}">
<f:selectItems value="#{countryBean.countries }" />
</h:selectOneMenu> 支持豆
public void changeCountry(ValueChangeEvent event){
String newValue = (String)event.getNewValue();
String oldValue = (String)event.getOldValue();
System.out.println("New Value : " + newValue);
System.out.println("Old Value : " + oldValue);
if ("1".equals(newValue)){
this.countries = new ArrayList<SelectItem>();
this.cities.add(new SelectItem("1","Delhi"));
this.cities.add(new SelectItem("2","Mumbai"));
}
if ("2".equals(newValue)){
this.cities = new ArrayList<SelectItem>();
this.cities.add(new SelectItem("1","Mossco"));
}
}请告诉我执行是否正确。它很好用。我的问题是:
发布于 2011-01-26 08:19:34
只有在表单提交时才会调用ValueChangeListener,而不是当输入的值被更改时才调用。因此,如果要在修改该值时运行此侦听器,则有两个解决方案:
在触发Primefaces...).事件时,
<f:ajax>或第三方库(如Richfaces、下面是Richfaces的一个例子:
<h:selectOneMenu id="countries" value="#{countryBean.selectedCountry}" valueChangeListener="#{countryBean.changeCountry}">
<a4j:support event="onchange" .../>
<f:selectItems value="#{countryBean.countries }" />
</h:selectOneMenu>关于侦听器的代码,这似乎是正确的,但是为什么您需要在这里使用ValueChangeListener呢?实际上,当您想跟踪一个值的修改时,这个侦听器是有用的。这就是为什么ValueChangeEvent同时提供getOldValue()和getNewValue()方法的原因。
在您的代码中,您不关心旧的值,因此基本上,您可以“简单地”执行一个操作,而不是valueChangeListener (例如)。(与Richfaces):
<h:selectOneMenu id="countries" value="#{countryBean.selectedCountry}">
<a4j:support event="onchange" actionListener="#{countryBean.changeCountry}"/>
<f:selectItems value="#{countryBean.countries }" />
</h:selectOneMenu>最后,关于valueChangeListener属性和<f:valueChangeListener>之间的区别是,第一个绑定Java方法(#{myBean.myMethod}),第二个绑定实现ValueChangeListener接口的Java类(type="com.foo.MyListenerClass")。所以第二种可能比第一种更通用.
发布于 2011-01-26 11:58:38
罗曼塔兹已经指出最多了,我只想直截了当地回答你的具体问题:
在h:selectOneMenu标记中添加f:valueChangeListener标记的优点是什么。我使用了普通属性valueChangeListener="#{countryBean.changeCountry}".
正如Romaintaz所说,属性指向一个方法,f:标记指向一个类。另一个优点是,只要有必要,您就可以拥有多个。
是否有必要使用onchange="submit()“代码来更改值。
Javascript不会改变值。只要enduser更改了值,Javascript就会提交整个表单,而无需自己按submit按钮。不,这没必要。您也可以直接删除它,并期望enduser自己按submit按钮。Once again,JavaScript不是JSF的一部分。
通过实现ActionListener接口来编写自定义侦听器与仅使用UIComponent标记中的属性(action="methodName")有什么区别。
这个问题已经问过了:difference between action and actionlistener。
发布于 2012-06-22 10:35:27
调用操作而不是valueChangeListener的romaintaz解决方案也很好,因为在发生“更改”事件时,该操作是在更新模型(例如允许数据库更新)之后调用的,而valueChangeListener是在此之前调用的.
https://stackoverflow.com/questions/4801535
复制相似问题