0

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

<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?
}
4

1 回答 1

0

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

但是,就您而言,selectOneMenu使用 value 和 label 属性填充,如果您遍历创建的集合以查找所需的内容,则该标签也可以访问。

简单地说,记住您在 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 方法中执行此(业务)工作 - 这是一种不好的做法

此外,selectOneMenu使用支持来实现您Map<String, String> options可能是一个更好的选择,因为可以通过简单的调用访问标签:String label = options.get(value)假设您的地图包含<option value, option label>as <key, pair>of map.

于 2013-02-21T20:27:24.540 回答