相关疑难解决方法(0)

Primefaces valueChangeListener或<p:ajax listener未针对p:selectOneMenu触发

我正在使用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)

jsf primefaces jsf-2

19
推荐指数
5
解决办法
17万
查看次数

单击h:selectOneMenu调用操作方法

我有以下下拉列表:

<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启动一些方法.我怎样才能实现它?

jsf action selectonemenu

15
推荐指数
1
解决办法
4万
查看次数

如何让PrimeFaces <p:selectOneMenu>调用valueChangeListener?

使用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?

谢谢.

primefaces jsf-2

14
推荐指数
1
解决办法
6万
查看次数

valueChangeListener的Ajax

我正在使用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事件中访问旧值?

ajax jsf onchange primefaces jsf-2

10
推荐指数
2
解决办法
2万
查看次数

如果仅更改了比例,则不会调用BigDecimal值的ValueChangeListener

我有一个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的行为方式.

jsf

10
推荐指数
1
解决办法
287
查看次数

Valuechangelistener在JSF中存在疑问

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标记内添加f:valueChangeListener标记有什么好处.我使用了普通属性valueChangeListener ="#{countryBean.changeCountry}".
  • 是否有必要使用onchange ="submit()此代码来更改值.
  • 通过实现ActionListener接口并仅使用UIComponent标记中的属性(action ="methodName")来编写自定义侦听器之间有什么区别.请解释一下.

jsf

7
推荐指数
2
解决办法
2万
查看次数

h:selectOneMenu onchange ="submit()"immediate ="true"不会跳过其他输入的验证

我无法在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)

当我更改菜单值时,其他输入的验证器仍然会激活.我怎么能否认呢?

selectonemenu jsf-2

7
推荐指数
1
解决办法
5万
查看次数

h:selectOneMenu具有用户定义的对象

我正在尝试实施两个 <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)

jsf

6
推荐指数
1
解决办法
1万
查看次数

在JSF中创建多个依赖/级联selectOneMenu下拉列表

我正在尝试制作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)

jsf hierarchy cascading selectonemenu ajax-update

6
推荐指数
2
解决办法
6441
查看次数

即使我没有更改值,也会在selectOneMenu上调用valueChangeListener方法

我有以下问题.当我单击"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 jsf-2

5
推荐指数
1
解决办法
7297
查看次数