获取Ice中标签的id和值

时间:2013-02-21 11:51:14

标签: selectonemenu ice

我有一个ice:selectOneMenu组件,需要获取从页面中选择的ID和值:

<ice:selectOneMenu partialSubmit="true" 
 value="#{bean.selectedType}" valueChangeListener="#{bean.listenerSelectedType}">
<f:selectItems value="#{bean.typeValues}"/>
<ice:selectOneMenu/>


public List<?> getTypeValues(){ 
List<SelectItem> returnList = new ArrayList<SelectItem>();
...
//SelectItem item = new SelectItem(id, label);
SelectItem item = new SelectItem("A", "B");

returnList.add(item);
}

public void listenerSelectedType(ValueChangeEvent event) {
    ...
    //The event only has the id ("A")
    //How can I get the label ("B") that is in the page?
}

1 个答案:

答案 0 :(得分:0)

这是事实,在表单提交时只会将<select> HTML元素的值发送到服务器。

但是,如果您使用值和标签属性填充selectOneMenu,那么如果您遍历创建的集合以找到所需内容,则标签也可以访问。

简单地说,记住您在bean中创建的集合并迭代它以获取标签。这是一个基本的例子:

@ManagedBean
@ViewScoped
public void MyBean implements Serializable {

    private List<SelectItem> col;

    public MyBean() {
        //initialize your collection somehow
        List<SelectItem> col = createCollection();//return your collection
        this.col = col;
    }

    public void listenerSelectedType(ValueChangeEvent event) {
        String value = (String)event.getNewValue();
        String label = null;
        for(SelectItem si : col) {
            if(((String)si.getValue()).equals(value)) {
                 label = si.getLabel();
            }
        }
    }

}

顺便说一句,请确保在类构造函数或@PostConstrct方法中初始化集合,并且不要在getter方法中执行此(业务)作业 - 它是 a bad practice

此外,使用支持selectOneMenu实施Map<String, String> options可能是更好的选择,因为标签可以通过简单的调用访问:String label = options.get(value),假设您的地图包含{{ 1}}作为地图的<option value, option label>