2013-02-18 66 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