我在表示“已选择”行的一列中有p:datatable和p:inputSwitch。我在p:inputswitch上触发p:ajax事件,其他行被侦听器取消选择,并且当前行被选中。在该事件中,我更新了数据表,后备Bean中的所有条目都有正确的值,开关处于打开状态,但仍为红色。
<h:panelGroup layout="block" styleClass="ui-g-12 refinance" id="cotPanel">
<p:dataTable id="cot" value="#{cot.cods}" var="offer" reflow="true">
<p:column width="18%" headerText="OFFER">
<p:outputLabel value="#{offer.name}" />
</p:column>
<p:column headerText="AAA" width="18%" styleClass="num">
<p:outputLabel value="#{of:formatNumberDefaultForLocale(offer.aaa, 'nl_NL')}" />
</p:column>
<p:column headerText="BBB" width="18%">
<p:outputLabel value="#{offer.bbb}" />
</p:column>
<p:column headerText="CCC" width="18%" styleClass="num">
<p:outputLabel value="#{of:formatNumberDefaultForLocale(offer.ccc, 'nl_NL')}" />
</p:column>
<p:column headerText="DDD" width="18%" styleClass="num">
<p:outputLabel value="#{offer.ddd}" />
</p:column>
<p:column headerText="Select" width="10%">
<h:panelGroup styleClass="Width100 Flex">
<p:inputSwitch value="#{offer.selected}">
<p:ajax event="change" listener="#{cot.onSelectCod(offer)}" process="@this"
update="mainForm:cotPanel" />
</p:inputSwitch>
</h:panelGroup>
</p:column>
<p:column headerText="SELECTED" width="10%">
<p:outputLabel value="#{offer.selected}"/>
</p:column>
</p:dataTable>
</h:panelGroup>
和支持bean侦听器中的
public void onSelectCod(Cod entry) {
if (entry.isSelected()) {
for (Cod codTemp : cods) {
if (!entry.equals(codTemp)) {
codTemp.setSelected(false);
}
}
}else {
// i dont let it become unselected if click on selected row, it becomes unselected only if it is clicked on another entry
entry.setSelected(true);
}
}
数据表的最后一栏显示所有值都是正确的,输入开关在右侧,但它是红色。我还尝试编写一个styleClass,当选择的值为true时为“绿色”,否则为“红色”,并且在DOM中我看到所有其他行都获得正确的类,但所选行却没有。
答案 0 :(得分:1)
问题在于您正在更改侦听器方法中的许多值。更新表时,其他开关也会更改,这将触发其余的侦听器。
相反,您可以使用click事件代替更改:
<p:inputSwitch value="#{offer.selected}" styleClass="#{offer.selected ? 'green' : 'red'}">
<p:ajax event="click" process="@this" listener="#{cot.onSelectCod(offer)"
update="mainForm:cotPanel" />
</p:inputSwitch>
这样,您可以确保仅针对用户与之交互的开关调用listener方法。
此外,您还需要稍微重写侦听器方法,因为现在只应使用您感兴趣的对象来调用它:
public void onSelectCod(Cod entry) {
// The entry here is now selected (you set it in the inputSwitch value)
// So just mark the rest of the entries as unselected
for (Cod codTemp : cods) {
if (!entry.equals(codTemp)) {
codTemp.setSelected(false);
}
}
}