HI,
请参阅以下代码:
<h:selectOneMenu id="countries" value="#{countryBean.selectedCountry}" onchange="submit()
valueChangeListener="#{countryBean.changeCountry}">
<f:selectItems value="#{countryBean.countries }" />
</h:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)
支持Bean
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"));
}
}
Run Code Online (Sandbox Code Playgroud)
如果实施正确,请告诉我.它工作正常.我的问题是:
Rom*_*las 20
在ValueChangeListener
当表单提交,而不是当输入值发生变化才会被调用.因此,如果要在修改值时运行此侦听器,则有两个解决方案:
onchange
事件被触发时提交您的表单(这是您在代码中所做的);<f:ajax>
,或者使用Richfaces,Primefaces等第三方库)来使用Ajax调用.以下是Richfaces的示例:
<h:selectOneMenu id="countries" value="#{countryBean.selectedCountry}" valueChangeListener="#{countryBean.changeCountry}">
<a4j:support event="onchange" .../>
<f:selectItems value="#{countryBean.countries }" />
</h:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)
关于你的监听器的代码,它似乎是正确的,但为什么你在这里需要一个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>
Run Code Online (Sandbox Code Playgroud)
最后,关于valueChangeListener
属性之间的区别<f:valueChangeListener>
是第一个绑定Java方法(#{myBean.myMethod}
),而第二个绑定type="com.foo.MyListenerClass"
实现ValueChangeListener
接口的Java类().所以第二个可能比第一个更通用......
Romaintaz已经指出了最多,我只是想直截了当地提出你的具体问题:
在h:selectOneMenu标记内添加f:valueChangeListener标记有什么好处.我使用了普通属性valueChangeListener ="#{countryBean.changeCountry}".
正如Romaintaz所说,属性指向一个方法,f:
标签指向一个类.另一个优点是,只要有必要,您可以拥有多个.
是否有必要使用onchange ="submit()此代码来更改值.
Javascript不会更改值.只要最终用户更改了值,Javascript就会提交整个表单而无需自己按下提交按钮.不,这不是必要的.您也可以删除它并期望最终用户自己按下提交按钮.再一次,JavaScript不是JSF的一部分.
通过实现ActionListener接口并仅使用UIComponent标记中的属性(action ="methodName")来编写自定义侦听器之间有什么区别.
之前已经提出过这个问题:action和actionlistener之间的区别.
归档时间: |
|
查看次数: |
19379 次 |
最近记录: |