我使用的是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>
我有什么选择?
谢谢, 帕特里克
答案 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);
}
}
希望这有效!