有没有办法在客户端切换组件之前拦截Expansion Toggle值Change事件?

时间:2014-07-01 20:33:18

标签: jsf-2 icefaces-3

我使用的是IceFaces的3.3版本,我们有一个人员数据表。我们需要一个扩展按钮,允许用户更新数据表中人员的任何属性。标签,ace:expansionToggle是我认为可以使用的标签,但如果我使用changeListener捕获事件,则客户端已经切换了组件。我需要验证该面板中的所有字段,以便在验证失败时,panelExpansion组件不会关闭。这里有一些代码来描述我正在尝试做什么。将组件绑定到支持bean似乎是一个好主意,但如果我在expandToggle的getter和setter中设置断点,则客户端已经折叠了面板,然后才能对它执行任何操作。

<ace:dataTable id="driverListTable" value="#{persons}" var="person">
    <ace:column id="exp">
        <ace:expansionToggler 
            binding="#{personBean.expansionToggle}" 
            changeListener="#{directDriverInfoBean.handleToggleEvent}"/>
    </ace:column>

    <ace:column headerText="#{msg.label_driver}">
        <ice:outputText value="#{person.firstName} #{person.lastName}"/>
    </ace:column>

    <ace:column styleClass="dobColWidth" headerText="#{msg.label_dob}">
        <ice:outputText value="#{person.userDob}"/>
    </ace:column>

    <ace:column styleClass="driverColWidth" headerText="Marital Status">
        <ice:outputText value="#{person.maritalStatus}"/>
    </ace:column>

    <ace:column headerText="Person Status">
        <ice:outputText value="#{person.status}"/>
    </ace:column>

    <ace:panelExpansion>
        <show all fields for person here>
    </ace:panelExpansion>
<ace:dataTable>

我有什么选择?

谢谢, 帕特里克

1 个答案:

答案 0 :(得分:0)

我刚刚发现了属性'stateMap'。它允许您访问dataTable中的每一行。 所以你可以做的是当他们点击行时,在你的'handleToggleEvent'方法中,你知道他们点击了什么行。您可以进行验证,如果失败,您可以检查stateMap的行并强制它为setExpanded(false)......

//add stateMap attribute to ace:dataTable

<ace:dataTable id="driverListTable" value="#{persons}" var="person" stateMap="stateMap">

//added the attribute currentRow so you can access row object.

 <ace:column id="exp">
    <ace:expansionToggler 
        binding="#{personBean.expansionToggle}" 
        changeListener="#{directDriverInfoBean.handleToggleEvent}">
        <f:attribute name="currentRow" value="#{person}" />
        <ace:expansionToggler>
   </ace:column>

//add the following variable to your backing bean

/** This row state map object allows us access to all the rows in the data table. */
   private RowStateMap stateMap = new RowStateMap();

// edit your handleToggleEvent() method like the following:

  public void handleToggleEvent(ExpansionChangeEvent event){
      RowObject obj = event.getComponent().getAttributes().get("currentRow");//one way to know what row they clicked.

      //do your validation

      if(failed){

       /*find the row in the state map.*/
       RowState rs = (RowState) stateMap.get(obj); 

       /*force it to not be expanded*/
       rs.setExpanded(false);
      }

}

希望这有效!