gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:15:26 25 4
gpt4 key购买 nike

我有以下问题。当我单击“Enviar”按钮时,这会调用另一个与 selectOneMenu 关联的方法(在属性中
valueChangeListener 称为“validarSelect”),然后在名为“validarBoton”的属性 actionListener 中调用此按钮关联的方法。
我想知道,为什么会发生这种情况。我期待 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>

这是 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...");
lista.add("Caracas");
lista.add("Bogota");
lista.add("Santiago");
}


public void validarBoton(ActionEvent actionEvent) {
System.out.println("Entro a validarBoton...");
// Add event code here...
}

public void validarSelect(ValueChangeEvent valueChangeEvent) {
// Add event code here...
System.out.println("Entro a validarSelect...");
}

public void setSelectCombo(HtmlSelectOneMenu selectCombo) {
this.selectCombo = selectCombo;
}

public HtmlSelectOneMenu getSelectCombo() {
return selectCombo;
}

public void setLista(List<String> lista) {
this.lista = lista;
}

public List<String> getLista() {
return lista;
}
}

这是我单击“Enviar”按钮时的输出:
  • 输入一个 validarSelect...
  • 输入一个有效的Boton...
  • 最佳答案

    valueChangeListener当提交的值与初始值不同时,将调用方法,无论您是否自己更改了它。因此,如果当前提交的值(在您的情况下为 "Caracas")与初始值(在您的情况下为 null)不同,则 valueChangeListener方法将被调用。

    也可以看看:

  • When to use valueChangeListener or f:ajax listener?
  • Best way to add a "nothing selected" option to a selectOneMenu in JSF


  • 无关 具体问题,结合 binding看到这个属性给我的印象是您正在尝试实现您在针对 JSF 1.x 的文章或答案中阅读过的内容。这被认为是在 JSF 1.x 中填充子下拉列表的黑客攻击的一部分。对于 JSF 2.x,您不需要这种方法。此外,带有“validar”(“validate”)的方法名称具有误导性。你真的不需要一个完全值得的 Validator ?但正如所说,这是一个不同的问题。

    也可以看看:
  • Make multiple dependent / cascading selectOneMenu dropdown lists in JSF
  • 关于jsf - 即使我没有更改值,也会在 selectOneMenu 上调用 valueChangeListener 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10182069/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com