2013-02-18 64 views
0

我有以下代碼,其中顯示兩個SelectOneMenus。第一個菜單的語言爲數值,第二個菜單告訴我如果En是語言,則選擇「一個或兩個」,如果是西班牙語,則選擇「uno或duo」。簡單的依賴selectOneMenus不起作用

我還需要確定我是否選擇了「two」項目,如果我現在將語言更改爲「Sp」,那麼「duo」必須是選定的項目。

我該怎麼做?以下是我有

的index.html:

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:f="http://java.sun.com/jsf/core"> 

    <h:head> 
     <title>Facelet Title</title> 
    </h:head> 
    <h:body> 
          <h:form id="myForm"> 
            <h:panelGrid columns="4"> 
             <h:outputLabel value="Language:" /> 
             <h:selectOneMenu value="#{myBean.language}"> 
              <f:selectItems value="#{myBean.languages}" /> 
              <f:ajax listener="#{myBean.doUpdate}" render ="myForm" /> 
             </h:selectOneMenu> 

             <h:outputLabel value="Items:" /> 
             <h:selectOneMenu value="#{myBean.item}"> 
              <f:selectItems value="#{myBean.items}" /> 
              <f:ajax listener="#{myBean.doUpdate}" render ="myForm" /> 
             </h:selectOneMenu> 
             <h:panelGrid columns="1" id ="show" > 
              <h:outputLabel value="#{myBean.language} #{myBean.item}"/> 
             </h:panelGrid> 

            </h:panelGrid> 
           </h:form> 
    </h:body> 
</html> 

爲myBean:

package bean; 



import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 
import javax.annotation.PostConstruct; 
import javax.ejb.Stateful; 
import javax.enterprise.context.RequestScoped; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ViewScoped; 



@ManagedBean(name = "myBean") 
//@Stateless 
@Stateful 
@ViewScoped 
public class MyBean implements Serializable{ 


    private List<String> languages; 
    private String language; 
    private String item; 
    private List<String> items; 

    public List<String> getItems() { 
     return items; 
    } 

    public void setItems(List<String> items) { 
     this.items = items; 
    } 


    /** 
    * init() method for initializing the bean. Is called after constuction. 
    */ 

    @PostConstruct 
    private void init() { 
    //public MyBean() { 
     languages = getAllLanguages(); 
     language = "en"; //defaultLanguage 
     items = getItemsFromOverview(); 
    } 

    public String getItem() { 
     return item; 
    } 

    public void setItem(String item) { 
     this.item = item; 
    } 

    public List<String> getLanguages() { 
     System.out.println("getLanguages, language " +language); 
     return languages; 
    } 



    public String getLanguage() { 
     System.out.println("getLanguage " +language); 
     return language; 
    } 

    public void setLanguage(String language) { 
     System.out.println("setLanguage " +language); 
     this.language = language; 
    } 




    public List<String> getAllLanguages() { 
     List<String> results = new ArrayList<String>(); 
     results.add("sp"); 
     results.add("en"); 

     if(results != null){ 
      System.out.println("getting all languages"); 
     } 
     return results; 
    } 


    public void doUpdate() { 

     System.out.println("doUpdate language " +language); 
     System.out.println("doUpdate item " +item); 

    } 

    /** 
    * Returns a list of all serialIDs present in the overview. 
    * @return 
    */ 
    private List<String> getItemsFromOverview() { 
     List<String> results = new ArrayList<String>(); 

     if(language.equalsIgnoreCase("en")){ 
      results.add("one"); 
      results.add("two"); 
     } 
     else { 
      results.add("uno"); 
      results.add("duo"); 

     } 
       return results; 
    } 


} 
+1

順便說一下,它是西班牙語dos;) – skuntsel 2013-02-18 13:26:14

+0

是吧,哎呀:) – user907810 2013-02-18 14:22:33

+0

你得到它的工作? – skuntsel 2013-02-20 08:55:25

回答

1

很簡單。您忘記更改第二個列表的當前值(items)。做到像

<h:form id="myForm"> 
    <h:selectOneMenu id="list1" value="#{myBean.language}" actionListener="#{myBean.updateFiledsInList2}"> 
     <f:selectItems value="#{myBean.languages}" /> 
     <f:ajax execute="@this" render ="list2 lang" /> 
    </h:selectOneMenu> 
    <h:selectOneMenu id="list2" value="#{myBean.item}" > 
     <f:selectItems value="#{myBean.items}" /> 
     <f:ajax execute="@this" render="item" /> 
    </h:selectOneMenu> 
    <h:outputText id="lang" value="#{myBean.language}"/> 
    <h:outputText id="item" value="#{myBean.item}"/> 
</h:form> 

在爲myBean以下的動作監聽:

public void updateFiledsInList2(ActionEvent event) { 
    if(language.equals("en")) { 
     items = new ArrayList<String>(); 
     items.add("one"); 
     items.add("two"); 
    } else if(language.equals("es")) { 
     items = new ArrayList<String>(); 
     items.add("uno"); 
     items.add("dos"); 
    } else { 
     items = null; 
    } 
} 

這說明,你管理你的代碼,通過去除您@ManagedBean(它不是一個@EJB)和處理@State... annotatings在上面提供的示例中(通過@EJB,或在@SessionScoped@ManagedBean等中有簡單列表)選擇更好。

爲了使您的項目的設定值的,只是一些行添加到您的動作偵聽器的代碼(假設一個項目的項目列表該索引是相同的,他們是在兩種語言相同大小的):

public void updateFiledsInList2(ActionEvent event) { 
    int index = (item == null) ? -1 : items.indexOf(item); 
    if(language.equals("en")) { 
     items = new ArrayList<String>(); 
     items.add("one"); 
     items.add("two"); 
    } else if(language.equals("es")) { 
     items = new ArrayList<String>(); 
     items.add("uno"); 
     items.add("dos"); 
    } else { 
     items = null; 
    } 
    if(index >= 0) { 
     item = (items == null) ? null : items.get(index); 
    } else { 
     item = null; 
    } 
} 
+0

如果我在表單名稱上執行ajax執行,該怎麼辦?那麼它是否應該根據菜單1不管理菜單2的更新? – user907810 2013-02-18 14:24:48

+0

你可以通過指定'render =「@form」來實現,但這實際上是一種開銷。如果您想更新某些內容,並且您應該知道要更新的內容,請更新它。否則,請更好地考慮代碼的結構。 – skuntsel 2013-02-18 14:27:09

+0

此外,依賴列表應該保持disctinct值,如汽車品牌模型。如果您有一個*多列表語言支持列表和其他*地點來保存語言選擇(會話作用域bean,查看參數等),那麼您的設置將會真正提高很多。這樣,你的列表將在bean的構建過程中被初始化。 – skuntsel 2013-02-18 14:29:31