p:数据表无法正确更新行

时间:2018-09-27 09:44:22

标签: jsf primefaces datatable

我在表示“已选择”行的一列中有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中我看到所有其他行都获得正确的类,但所选行却没有。

enter image description here

1 个答案:

答案 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);
        }
    }
}