动态生成ice:commandButton组件

时间:2009-08-04 19:32:13

标签: jsf java-ee icefaces

1 个答案:

答案 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会使用clientIdread 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之外。