我有一个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?
}
答案 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>
。