簡體   English   中英

使用h:selectOneMenu f:ajax進行兩次ajax更新

[英]Two ajax updates with h:selectOneMenu f:ajax

簡而言之,如果組件已由Ajax更新,則無法啟動新事件Ajax

我有三個h:selectOneMenu:A,B和C。當我在A中觸發更改事件時,然后更新B h:selectOneMenu。 當我在B中觸發更改事件時,然后更新C h:selectOneMenu。

問題是,當更新B h:selectOneMenu的內容時,B中的ajax將不起作用,而C也將永遠無法更新。

<h:selectOneMenu id="A" value="#{paqueteBean.mes}" label="a">
<f:selectItem itemLabel="Seleccione..." itemValue="" />
<f:selectItem itemLabel="Enero" itemValue="ENERO" />
<f:selectItem itemLabel="Febrero" itemValue="FEBRERO" />
<f:ajax listener="#{paqueteBean.changeMes}" render="B" />
</h:selectOneMenu>

<h:selectOneMenu id="B" value="#{paqueteBean.origen}" label="b">
<f:selectItem itemLabel="Seleccione..." itemValue="" />
<f:selectItems value="#{paqueteBean.origenes}" />
<f:ajax listener="#{paqueteBean.changeOrigen}" render="C"/>
</h:selectOneMenu>

<h:selectOneMenu id="C" value="#{paqueteBean.zona}" label="c">
<f:selectItem itemLabel="Seleccione..." itemValue="" />
<f:selectItems value="#{paqueteBean.zonas}" />
</h:selectOneMenu>

ajax響應很好,但是在更新后根本不起作用:

<?xml version='1.0' encoding='UTF-8'?>
<partial-response id="j_id1"><changes><update id="B"><![CDATA[<select id="B" name="b" size="1" onchange="mojarra.ab(this,event,'valueChange','@this','C')"> <option value="">Seleccione...</option>
    <option value="BUE">Ezeiza o Aeroparque</option>
</select>]]></update><update id="j_id1:javax.faces.ViewState:0"><![CDATA[-2984590031183218074:6198891110668113457]]></update></changes></partial-response>

更新!

使用PrimeFaces,我有相同的行為:

<h:form id="filtro">
<p:selectOneMenu id="A" value="#{paqueteBean.mes}">
    <f:selectItem itemLabel="Seleccione..." itemValue="" />
    <f:selectItem itemLabel="Enero" itemValue="ENERO" />
    <f:selectItem itemLabel="Febrero" itemValue="FEBRERO" />
    <f:selectItem itemLabel="Marzo" itemValue="MARZO" />
    <p:ajax listener="#{paqueteBean.changeMes}" update="B" />
</p:selectOneMenu>

<p:selectOneMenu id="B" value="#{paqueteBean.origen}"
    disabled="#{empty paqueteBean.mes}">
    <f:selectItem itemLabel="Seleccione..." itemValue="" />
    <f:selectItems value="#{paqueteBean.origenes}" />
    <p:ajax listener="#{paqueteBean.changeOrigen}" update="C"
        process="origen mesSalida" />
</p:selectOneMenu>

<p:selectOneMenu id="C" value="#{paqueteBean.zona}"
    disabled="#{empty paqueteBean.mes or empty paqueteBean.origen}">
    <f:selectItem itemLabel="Seleccione..." itemValue="" />
    <f:selectItems value="#{paqueteBean.zonas}" />
</p:selectOneMenu>

當我更改一些A值時,將觸發支持bean中的方法,但是當我更改某些B值時,將不觸發支持bean中的方法。

最奇怪的是,對於ajax更新之前B中存在的項目,將調用backing bean。

支持Bean,沒什么特別的:

    public void changeMes(){
    logger.debug("en changeMes el Mes es: " + this.mes);

    this.origenes = new HashMap<String, String>();
    this.origenes.put("Ezeiza o Aeroparque", "BUE");
}

public void changeOrigen(){
    logger.debug("Mes: " + this.mes);
    logger.debug("Origen" + this.origen);

    this.zonas = new HashMap<String, String>();
    this.zonas.put("Argentina", "AR");
    this.zonas.put("Brasil", "BR");
}

public void changeZona(){
    logger.debug("Mes: " + this.mes);
    logger.debug("Origen" + this.origen);
    logger.debug("Zona" + this.zona);

    this.destinos = new HashMap<>();
    this.destinos.put("Mar del Plata", "MDQ");
    this.destinos.put("Punta Lara", "LTA");
}

除了使用<f:ajax/>您還可以使用PrimeFaces-Ajax-Element <p:ajax>為您提供更新屬性:

<p:ajax update="elementID"/>

我可以推薦的另一種可能性:您是否嘗試過將SelectOneMenus放入<h:form> -Element? 看來您沒有使用表格。 這樣做,則您可以隨時更新表單以更改菜單。 在我的項目中為我工作得很好。

更新:

這是一個工作示例:

豆角,扁豆:

import java.util.ArrayList;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.model.SelectItem;

@ManagedBean(name="myBean")
@SessionScoped
public class MyBean {

    private boolean bDisabled;
    private boolean cDisabled;

    private String selectedA;
    private String selectedB;
    private String selectedC;
    private ArrayList<SelectItem> aItems;
    private ArrayList<SelectItem> bItems;
    private ArrayList<SelectItem> cItems;

    public MyBean() {

    }

    @PostConstruct
    public void init(){
        try{            

            this.bDisabled = new Boolean(true);
            this.cDisabled = new Boolean(true);

            this.aItems = new ArrayList<SelectItem>();
            this.bItems = new ArrayList<SelectItem>();
            this.cItems = new ArrayList<SelectItem>();

            this.aItems.add(new SelectItem("NONE", "---?"));
            this.aItems.add(new SelectItem("A1", "A 1"));
            this.aItems.add(new SelectItem("A1", "A 1"));
            this.aItems.add(new SelectItem("A1", "A 1"));

            this.bItems.add(new SelectItem("NONE", "---?"));
            this.cItems.add(new SelectItem("NONE", "---?"));

        }catch(Exception e){
            e.printStackTrace();
        }
    }   

    public final void selectA(final AjaxBehaviorEvent event){
        try{
            System.out.println(this.selectedA);
            this.bItems.clear();
            this.bItems.add(new SelectItem("NONE", "---?"));
            if(this.selectedA.equals("NONE") ){
                this.setbDisabled(true);
                return;
            }
            this.bItems.add(new SelectItem("B1","B 1"));
            this.setbDisabled(false);
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }

    public final void selectB(final AjaxBehaviorEvent event){
        try{
            System.out.println(this.selectedB);
            this.cItems.clear();
            this.cItems.add(new SelectItem("NONE", "---?"));
            if(this.selectedB.equals("NONE") ){
                this.setcDisabled(true);
                return;
            }           
            this.cItems.add(new SelectItem("C1","C 1"));
            this.setcDisabled(false);
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }

    public final void selectC(final AjaxBehaviorEvent event){
        try{
            System.out.println(this.selectedC);
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }

    public String getSelectedA() {
        return selectedA;
    }

    public void setSelectedA(String selectedA) {
        this.selectedA = selectedA;
    }

    public String getSelectedB() {
        return selectedB;
    }

    public void setSelectedB(String selectedB) {
        this.selectedB = selectedB;
    }

    public String getSelectedC() {
        return selectedC;
    }

    public void setSelectedC(String selectedC) {
        this.selectedC = selectedC;
    }

    public ArrayList<SelectItem> getaItems() {
        return aItems;
    }

    public void setaItems(ArrayList<SelectItem> aItems) {
        this.aItems = aItems;
    }

    public ArrayList<SelectItem> getbItems() {
        return bItems;
    }

    public void setbItems(ArrayList<SelectItem> bItems) {
        this.bItems = bItems;
    }

    public ArrayList<SelectItem> getcItems() {
        return cItems;
    }

    public void setcItems(ArrayList<SelectItem> cItems) {
        this.cItems = cItems;
    }

    public boolean isbDisabled() {
        return bDisabled;
    }

    public void setbDisabled(boolean bDisabled) {
        this.bDisabled = bDisabled;
    }

    public boolean iscDisabled() {
        return cDisabled;
    }

    public void setcDisabled(boolean cDisabled) {
        this.cDisabled = cDisabled;
    }

}

XHTML:

<!DOCTYPE html>
<html 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"
      >
<h:head>
    <meta charset="UTF-8" />
    <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    <title>Test</title>    
</h:head>
<body>
<f:view> 
<h:form id="dataForm">
<h:selectOneMenu value="#{myBean.selectedA}" style="width: 100%;">
    <f:selectItems value="#{myBean.aItems}" /> 
    <f:ajax execute="@form" render="@form" listener="#{myBean.selectA}" />
</h:selectOneMenu>

<h:selectOneMenu disabled="#{myBean.bDisabled}" value="#{myBean.selectedB}" style="width: 100%;">
    <f:selectItems value="#{myBean.bItems}" /> 
    <f:ajax execute="@form" render="@form" listener="#{myBean.selectB}" />
</h:selectOneMenu>

<h:selectOneMenu disabled="#{myBean.cDisabled}" value="#{myBean.selectedC}" style="width: 100%;">
    <f:selectItems value="#{myBean.cItems}" /> 
    <f:ajax execute="@form" render="@form" listener="#{myBean.selectC}" />
</h:selectOneMenu>

</h:form>
</f:view>
</body>
</html>

我有同樣的錯誤。 對於第二個selectonemenu我想念一個塞特犬。 在您的代碼中,它是myBean.selectedB的設置器。 檢查所有的獲取器和設置器。 也許有問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM