答案 0 :(得分:2)
<ice:commandButton binding="#{season}"/>
绑定属性必须绑定到类型UIComponent的bean属性。在您希望框架为您提供对辅助bean中的组件的引用或从提供bean提供实例的位置使用它。有关详细信息,请参阅JSF 1.2 spec的第3.1.5节。
<ice:commandButton id="#{season.id}"
partialSubmit="true"
style="background-color: #FFFFFF"
value="#{season.value}"
actionListener="#{Phase1EventBean.updateSeasons}"/>
id
属性不能是动态的 - JSF会使用clientId(read this for more detail)来确保客户端的唯一性。
编辑:
但是,在用户界面上,当我单击一个按钮时,每个按钮似乎都会切换。
我猜测ice:panelSeries
不会像某些重复控件那样存储每一行的组件状态(例如dataTable)。请记住,只有一个按钮实例,即使每个“行”编码/解码一次。
我从未使用过ICEfaces,但我建议绑定到类似于此的bean:
public class Bean {
private final List<SelectionBean> seasonsList = Arrays.asList(
new SelectionBean("Spring"), new SelectionBean("Summer"),
new SelectionBean("Autumn"), new SelectionBean("Winter"));
public List<SelectionBean> getSeasonsList() { return seasonsList; }
public static class SelectionBean {
private String season;
private boolean selected;
public SelectionBean() {}
public SelectionBean(String season) { this.season = season; }
public String getSeason() { return season; }
public void setSeason(String season) { this.season = season; }
public String toggle() {
System.out.println("toggle " + season);
selected = !selected;
return null;
}
public String getStyle() {
return selected ? "background-color: yellow" : "background-color: blue";
}
}
}
我已经将逻辑降低到最低限度,但希望你能够修改逻辑以重新放入hibernate支持。你的组件会变成这样:
<ice:panelSeries value="#{bean.seasonsList}" var="item">
<ice:commandButton partialSubmit="true"
style="#{item.style}"
value="#{item.season}"
action="#{item.toggle}"/>
</ice:panelSeries>
因此,对于列表中的每个项目,所有绑定都会返回到一个状态(SelectionBean实例),并且您不会尝试在组件本身上存储任何非声明性状态。
我尽可能使用action
而不是actionListener
- 它将JSF内容保留在POJO之外。