2010-08-12 2 views
1

Хорошо, я застрял в этом пару дней (преуменьшение).JSF ValueChangeEvent: как изменить параметры на одном SelectOneMenu на основе моего выбора в предыдущем SelectOneMenu?

Скажем, у меня есть selectOneMenu

<h:selectOneMenu id="selectFamily" 
     valueChangeListener="#{menuBean.changeFamily}"  
     onclick="submit()" 
     immediate="true" > 
     <f:selectItems id="familyNames" value="#{menuBean.familyNames}" /> 
     </h:selectOneMenu> 

И я хочу, чтобы изменить параметры на другом selectOneMenu на основании выбранных в этом предыдущем selectOneMenu варианты.

<h:selectOneMenu id="selectFunction" immediate="true"> 
     <f:selectItems id="functions" value="#{menuBean.functions}" /> 
    </h:selectOneMenu> 

Как мне это сделать? Чтение вокруг, у меня есть несколько идей о том, как это сделать, но я просто не могу показаться, чтобы получить это право. Мне жаль, что я просто сброшу класс бобов, надеясь, что кто-то может вести меня.

общественного класса MenuBean {

/** Creates a new instance of MenuBean */ 
public MenuBean() { 
} 

private SelectItem[] familyNames = { 
    new SelectItem((Integer) 1,"Operations"), 
    new SelectItem((Integer) 2, "Special"), 
    new SelectItem((Integer) 3, "Support")}; 

public SelectItem[] getFamilyNames() { 
    return familyNames; 
} 

private SelectItem[] functions = {new SelectItem("Select Function")}; 

private SelectItem[] operationsFunctions = { 
    new SelectItem("Air/Ocean Freight"), 
    new SelectItem("Customs"), 
    new SelectItem("Land Transport"), 
    new SelectItem("Logistics/SCM"), 
    new SelectItem("Rail Transport"), 
    new SelectItem("Special") 
}; 

private SelectItem[] specialFunctions = { 
    new SelectItem("General Management"), 
    new SelectItem("Quality & Processes") 
}; 

private SelectItem[] supportFunctions = { 
    new SelectItem("Finance/Controlling"), 
    new SelectItem("Human Resources"), 
    new SelectItem("ICT"), 
    new SelectItem("Legal Affairs"), 
    new SelectItem("Marketing/Public Relations"), 
    new SelectItem("Procurement"), 
}; 

public SelectItem[] getFunctions(int n) { 

    if (n==1) { 
     functions = operationsFunctions; 
    } else if (n==2) { 
     functions = specialFunctions; 
    } else if (n==3) { 
     functions = supportFunctions; 
    } 

    return functions; 
} 

public void setFunctions(SelectItem[] function) { 
    this.functions = function; 
} 

public void changeFamily(ValueChangeEvent event) { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    int value = (Integer) event.getNewValue(); 
    setFunctions(getFunctions(value)); 

    context.renderResponse();   
}} 
+0

Вы используете JSF1.2 или 2? – Dejell

+0

Я использую JSF 2. –

ответ

3

Я думаю, что проблема здесь в том, что getFunctions (INT I) принимает параметр. Поскольку он вызывается приведенным ниже EL выражением, он не должен принимать параметр.

<f:selectItems id="functions" value="#{menuBean.functions}" /> 

Кроме того, значение из ValueChangeEvent должно быть литыми в строку, не является целым числом. Не уверен в вашем вопросе, если вы набрали selectItem в форме, если нет, вам тоже нужно это сделать. Последнее, что я могу придумать, - это область поддержки Backing, она должна выжить после обратной передачи.

Я попробовал пример ниже с сеансом областью действия managedBean и JSF 1.2, и она работала:

<h:form> 
     <h:selectOneMenu id="selectFamily" 
         valueChangeListener="#{menuBean.changeFamily}" 
         immediate="true" 
         onchange="submit()"> 
      <f:selectItems id="familyNames" value="#{menuBean.familyNames}"/> 
     </h:selectOneMenu> 

     <h:selectOneMenu id="selectFunction" immediate="true"> 
      <f:selectItems id="functions" value="#{menuBean.functions}"/> 
     </h:selectOneMenu> 
    </h:form> 

public class MenuBean { 
    private SelectItem[] familyNames = { 
      new SelectItem(1, "Operations"), 
      new SelectItem(2, "Special"), 
      new SelectItem(3, "Support")}; 

    public SelectItem[] getFamilyNames() { 
     return familyNames; 
    } 

    private SelectItem[] functions = {new SelectItem("Select Function")}; 

    private SelectItem[] operationsFunctions = { 
      new SelectItem("Air/Ocean Freight"), 
      new SelectItem("Customs"), 
      new SelectItem("Land Transport"), 
      new SelectItem("Logistics/SCM"), 
      new SelectItem("Rail Transport"), 
      new SelectItem("Special") 
    }; 

    private SelectItem[] specialFunctions = { 
      new SelectItem("General Management"), 
      new SelectItem("Quality & Processes") 
    }; 

    private SelectItem[] supportFunctions = { 
      new SelectItem("Finance/Controlling"), 
      new SelectItem("Human Resources"), 
      new SelectItem("ICT"), 
      new SelectItem("Legal Affairs"), 
      new SelectItem("Marketing/Public Relations"), 
      new SelectItem("Procurement"), 
    }; 

    public SelectItem[] getFunctions() { 
     return functions; 
    } 

    private void switchSelectedFunctions(int n) { 
     if (n == 1) { 
      setFunctions(operationsFunctions); 
     } else if (n == 2) { 
      setFunctions(specialFunctions); 
     } else if (n == 3) { 
      setFunctions(supportFunctions); 
     } 
    } 

    public void setFunctions(SelectItem[] function) { 
     this.functions = function; 
    } 

    public void changeFamily(ValueChangeEvent event) { 
     FacesContext context = FacesContext.getCurrentInstance(); 
     int value = Integer.valueOf(((String) event.getNewValue())); 
     switchSelectedFunctions(value); 
     context.renderResponse(); 
    } 
} 
+0

ценю это ebaxt, но его все еще не работает. –

+0

Я попробовал это самостоятельно, см. Обновленный ответ. – ebaxt

+0

gee спасибо, что это работает! тег и Integer.valueOf сделали разницу. Спасибо. :) –

Смежные вопросы