Jsf p:datatable未正确更新行

Jsf p:datatable未正确更新行,jsf,primefaces,datatable,Jsf,Primefaces,Datatable,我在一列中有p:datatable和p:inputSwitch,表示“selected”行。我在p:inputswitch上触发p:ajax事件,其他行将被侦听器取消选择,当前行将被选择。在我更新datatable的那个事件中,支持bean中的所有条目都有一个正确的值,开关是打开的,但它仍然是红色的 <h:panelGroup layout="block" styleClass="ui-g-12 refinance" id="cotPanel"> <p:dataTab

我在一列中有p:datatable和p:inputSwitch,表示“selected”行。我在p:inputswitch上触发p:ajax事件,其他行将被侦听器取消选择,当前行将被选择。在我更新datatable的那个事件中,支持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>
datatable中的最后一列显示所有值都是正确的,输入开关在右侧,但它是红色的。我还尝试编写一个样式类,当selected为true时为“绿色”,否则为“红色”,我在DOM中看到所有其他行都得到了正确的类,但selected行没有


问题在于您正在更改侦听器方法中的许多值。当您更新表时,其他开关将被更改,这将触发其余侦听器

相反,您可以使用单击事件而不是更改:

<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>

我看到你有静态的
styleClass
属性,它们怎么能被切换?即使我删除了它也不会改变。我的意思是,你的
red
green
类应该在哪里为表行设置?您没有告诉JSF这一点,至少在这里提供的代码中是这样。您只需更改所选的属性值并更新面板。我删除了它们,因为组件应该允许这样做,对吗?因为我更新了整个数据表。我将它们放在p:inputSwitch标记中,类似于styleClass=“#{offer.selected?”“绿色”:“红色”}。但是什么都没有。最后的代码是否更新了DOM中
inputSwitch
的类?如果是,则可能是CSS问题(样式需要修复)。如果没有,那么这是一个与JSF相关的问题(组件未被正确引用或任何验证错误)。如果是第二种情况,我猜您的请求到达服务器,并且正在处理
onSelectCod
(如您在问题中所述),那么您引用面板组件的方式肯定会有问题。我将稍后再试。现在,我使用temp对象,在其中保留选中的项,然后检查列表中的哪个对象是temp,并将选中的标志设置为列表中的对象。我认为关于点击事件你是对的。听起来很合理:)。谢谢你的帮助。我以前也用temp对象写过其他解决方案。。问题是这似乎有点让人难以承受。。让听众保持你在问题中所说的方式应该适用于此;-)是的,我将尝试单击事件。我讨厌写多余的代码只是为了“破解”一些东西。事实上,代码现在变得更简单了!JSF负责在与之交互的输入中设置所选值。没有为p:inputSwitch定义Click事件。我明白你的意思。我用方法改变了一些输入。。。但我注意到,backingbean中的方法只调用了一次。在我看来,它应该与变更事件一起工作。
<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>
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);
        }
    }
}