我正在使用Primefaces 3.4.2.
我的JSF页面中有以下内容
<p:selectOneMenu id="emp" value="#{mymb.emp.employeeName}"
valueChangeListener="#{mymb.handleChange}"
required="true"
style="width: 150px;">
<f:selectItem noSelectionOption="true"
itemLabel="Please Select"/>
<f:selectItems value="#{mymb.employeeList}" var="emp"
itemLabel="#{emp.employeeName}"
itemValue="#{emp.employeeNumber}"/>
<p:ajax update="sublist"/>
</p:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)
并在ManagedBean中
public void handleChange(ValueChangeEvent event){
System.out.println("here "+event.getNewValue());
}
Run Code Online (Sandbox Code Playgroud)
问题是valueChangeListener
没有触发,即handleChange
方法没有被调用.我尝试了以下,但它也没有工作.
<p:ajax update="sublist" listener="#{mymb.handleChange}" />
Run Code Online (Sandbox Code Playgroud)
单独的JSF页面:
<ui:composition template="/templates/layout.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<ui:define name="content">
<h:head>
</h:head>
<h:body>
<h:form id="form">
<p:panelGrid columns="6">
<h:outputLabel value="Employees" for="employees" />
<p:selectOneMenu id="employees"
value="#{mymb.employeesList}"
required="true">
<f:selectItems value="#{mymb.employeesList}" var="emp"
itemLabel="#{emp.employeeName}" />
<p:ajax listener="#{mymb.handleChange}" />
</p:selectOneMenu>
</p:panelGrid>
</h:form>
</h:body>
</ui:define>
</ui:composition>
Run Code Online (Sandbox Code Playgroud) 我有以下下拉列表:
<h:selectOneMenu value="#{user.favCoffee3}" onclick="">
<f:selectItems value="#{user.favCoffee3Value}" var="c"
itemLabel="#{c.coffeeLabel}" itemValue="#{c.coffeeValue}" />
</h:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)
我想通过下拉列表项单击从bean启动一些方法.我怎样才能实现它?
使用PF 3.0-RC1快照(11/22/2011)
我有一个复合组件.我想在进行选择时调用valueChangeListener,但它似乎没有调用监听器.
以下是组件的代码:
<p:selectOneMenu style="width: 220px;"
value="#{customerProfileSessionBean.selectedAccount}"
valueChangeListener="#{customerProfileSessionBean.accountValueChange}" >
<f:selectItems value="#{sessionBean1.custAccountList}"/>
</p:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)
支持bean中的侦听器有一个未被调用的print语句(至少我没有在服务器日志中看到它).
还有什么我需要做的是在值改变时调用valueChangeListener吗?我需要使用吗?
另外,在监听器中,是否有传递的ValueChangeEvent?
谢谢.
我正在使用p:ajax
监听器来处理值更改事件(因为valueChangeListener
在表单提交时启动):
<p:ajax event="change" listener="#{bean.onNameChanged}"/>
Run Code Online (Sandbox Code Playgroud)
处理方法:
public void onNameChanged(final AjaxBehaviorEvent event)
Run Code Online (Sandbox Code Playgroud)
问题是,我无法在AjaxBehaviorEvent
其类层次结构中找到读取输入旧值的位置.我也不能在谷歌中找到提示,如何获得旧价值......
如何在p:ajax onChange
事件中访问旧值?
我有一个JSF 2.2应用程序,用户必须输入BigDecimal
值<h:inputText>
.对于这样的输入字段,a valueChangeListener
被配置为在输入变化时被调用.这是XHTML代码:
<h:form id="theForm">
<h:inputText id="bd" value="#{bean.bd}"
valueChangeListener="#{bean.bdChangedListener()}"/>
<h:commandButton id="submit" value="Submit" />
</h:form>
Run Code Online (Sandbox Code Playgroud)
在大多数情况下,这样做很好.bdChangedListener()
当值改变并按下提交按钮时,将调用该方法.该值已正确提交给模型.
但是,如果我进入1.1
并改变它1.10
,新的值被提交到模型,但valueChangeListener
在从来没有所谓!Debuging表明,其原因在于javax.faces.component.UIInput#compareValues()
.这种方法的JavaDoc
说:
如果新值与先前值不同,则返回true.首先通过将值传递给参数previous之前的equals方法来比较这两个值.如果该方法返回true,则返回true.如果该方法返回false,并且两个参数都实现java.lang.Comparable,则通过将值传递给参数previous之前的compareTo方法来比较这两个值.如果此方法返回0,则返回true,否则返回false.
所以在我看来,这是故意的.但为什么?
用户输入已更改,并且存在应用程序,其中a的比例BigDecimal
是相关的.所以JSF不应该忽略改变的输入,而是通知我!它使用新值更新模型,为什么它会跳过valueChangeListener-method?
我怎样才能避免这种行为并以干净的方式得到通知?(我知道我可以挂进制定者,但这不是我所谓的干净方式!)
有任何想法吗?
除了上面我想提到的,我已经读过像BigDecimal equals()和compareTo()这样的问题.我确实理解为什么BigDecimal equals()
和compareTo()
他们的行为一样,我说它是正确的.BigDecimal的行为不是问题,UIInput.compareValues()
而是问题.
此外,转换器(如评论或已删除的答案中所示)将无法保存我的一天.用户输入已正确转换,我需要BidDecimal,包括我的应用程序中的确切比例.任何返回BigDecimal的转换器都不会改变观察到的行为.
围绕BigDecimal的包装类可能会解决我的问题,但不是我认为的干净解决方案.我真的想知道为什么UIInput的行为方式.
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)
如果实施正确,请告诉我.它工作正常.我的问题是:
我无法在h:selectOneMenu
不验证其他输入的情况下立即提交.这是代码:
<h:selectOneMenu value="#{a.avalue}" onchange="submit()" immediate="true">
<f:selectItems value="#{b.bvalue}" var="k" itemLabel="#{k.asdad}"
itemValue="#{k.asdad}"/>
</h:selectOneMenu>
<h:inputText id="sada" value="#{c.cvalue}" required="true"
requiredMessage="*asdadadadasd"
validatorMessage="*asdsadadadadad">
<f:validateLength maximum="80"/>
</h:inputText>
Run Code Online (Sandbox Code Playgroud)
当我更改菜单值时,其他输入的验证器仍然会激活.我怎么能否认呢?
我正在尝试实施两个 <h:selectOneMenu/>
第一个包含Type 1对象.当用户从该列表中选择一个对象时,<h:selectOneMenu/>
将显示第二个对象.
这是我的代码
XHTML
<h:form>
<h:selectOneMenu value="#{handler.selectedType1}" valueChangeListener="#{handler.valueChanged}">
<f:selectItems value="#{handler.types1}" var="type1" itemValue="#{type1.name}" itemLabel="#{type1.name}" />
<a4j:ajax event="valueChange" render="type2List" execute="@this"/>
</h:selectOneMenu>
<h:selectOneMenu id="type2List" value="#{handler.selectedType2}" rendered="#{not empty handler.selectedType2}">
<f:selectItems value="#{handler.types2}" var="type2" itemLabel="#{type2.name}" />
</h:selectOneMenu>
</h:form>
Run Code Online (Sandbox Code Playgroud)
托管bean
@ManagedBean
@ViewScoped
public class Handler {
private Type1 selectedType1;
private List<Type1> types1;
private Type2 selectedType2;
private List<Type2> types2;
//getters, setters
public void valueChanged(ValueChangeEvent event) {
variants.clear();
if (event.getNewValue() != null) {
System.out.println("new value: " + event.getNewValue());
// Fill the second list
}
} …
Run Code Online (Sandbox Code Playgroud) 我正在尝试制作4个相关菜单.
当用户从第一个菜单中选择项目时,第二个菜单将显示相关数据,当用户从第二个菜单中选择项目时,第三个菜单将显示相关数据,依此类推.
用户将仅在第一个菜单上看到项目,而其他项目将为空白.如果他在第一个菜单上选择一个项目,则第二个菜单将显示数据,但第三个和第四个将保持空白,依此类推.用户最终必须从所有4个菜单中选择条目.
<h:selectOneMenu id="first" value="#{nodes.selectState"}>
<f:selectItems value="#{nodes.stateList}"/>
<f:ajax render="second">
</h:selectOneMenu>
<h:selectOneMenu id="second" value="#{nodes.selectCity"}>
<f:selectItems value="#{nodes.cityList}"/>
<f:ajax render="third">
</h:selectOneMenu>
<h:selectOneMenu id="third" value="#{nodes.selectRegion"}>
<f:selectItems value="#{nodes.regionList}"/>
<f:ajax render="fourth">
</h:selectOneMenu>
<h:selectOneMenu id="fourth" value="#{nodes.selectStation"}>
<f:selectItems value="#{nodes.stationList}"/>
</h:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)
节点Java类
private String selectState; //+setters, getters
private String selectCity; //+setters, getters
private String selectRegion; //+setters, getters
private String selectStation; //+setters, getters
private List<SelectItem> stateList; //+setters, getters
private List<SelectItem> cityList; //+setters, getters
private List<SelectItem> regionList; //+setters, getters
private List<SelectItem> stationList; //+setters, getters
public getStateList(){
stateList= new ArrayList<SelectItem>();
stateList.add(new …
Run Code Online (Sandbox Code Playgroud) 我有以下问题.当我单击"Enviar"按钮时,这将调用与selectOneMenu相关联的另一个方法(在属性valueChangeListener中称为"validarSelect"),然后调用此按钮在属性actionListener中关联的方法"validarBoton".我想知道,为什么会这样.我希望valueChangeListener
不会被调用,因为我没有更改下拉列表.
这是我的页面JSF:
<?xml version='1.0' encoding='windows-1252'?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<f:view xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html">
<html xmlns="http://www.w3.org/1999/xhtml">
<h:head></h:head>
<h:body>
<h:form>
<h:commandButton value="Enviar..." id="validar" actionListener="#{Domiciliacion.validarBoton}"/>
<h:selectOneMenu valueChangeListener="#{Domiciliacion.validarSelect}"
binding="#{Domiciliacion.selectCombo}">
<f:selectItems value="#{Domiciliacion.lista}"/>
<f:ajax event="valueChange" render="@this"/>
</h:selectOneMenu>
</h:form>
</h:body>
</html>
Run Code Online (Sandbox Code Playgroud)
这就是ManagedBean:
package domiciliaciontest;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.component.html.HtmlSelectOneMenu;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;
@ManagedBean(name = "Domiciliacion")
@ViewScoped
public class MB0001 {
private HtmlSelectOneMenu selectCombo;
private List<String> lista = new ArrayList<String>();
public MB0001() {
super();
System.out.println("Entro al constructor..."); …
Run Code Online (Sandbox Code Playgroud) jsf ×8
jsf-2 ×5
primefaces ×3
action ×1
ajax ×1
ajax-update ×1
cascading ×1
hierarchy ×1
onchange ×1