<a4j:repeat> 标记中集合中特定项目的 ValueChangeListener

ValueChangeListener for a particular item in a Collection in a <a4j:repeat> tag

如何根据标准决定在 List<Driver> 中设置特定 Driver 的字段?没有我自己的属性:

<f:attribute name="hashCode" value="#{driver.hashCode()}"/>

Java BackBean:

public class BackBean {
    List<Driver> drivers;

    public List<Driver> getDrivers() {
        List<Driver> drivers = new ArrayList<Driver>();
        ...
        return drivers;
    }

    public void licenceReplacedCheckBoxChanged(ValueChangeEvent e) {
        Boolean driverDocChanged = (Boolean) e.getNewValue();

        int hashCode = (Integer) e.getComponent().getAttributes().get("hashCode");

        for (Driver buff : getDrivers()) {
            boolean findDriver = ( buff.hashCode() == hashCode );
            if (findDriver) {
                buff.setDocumentReplaced(driverDocChanged);
                buff.makeChangeDriver();
            }
        }
    }
}

xhtml:

<a4j:repeat value="#{backBean.drivers}" var="driver" rowKeyVar="rowDriver" id="drivers">
...
    <div class="controls one-control-group">
        <h:selectBooleanCheckbox value="#{driver.documentReplaced}"                 
            valueChangeListener="#{backBean.licenceReplacedCheckBoxChanged}">
            <f:attribute name="hashCode" value="#{driver.hashCode()}"/>
            <a4j:ajax execute="@this" render="..." />
        </h:selectBooleanCheckbox>
    </div>
...
</a4j:repeat>

只需在<a4j:ajax listener>中调用所需的方法即可。

<h:selectBooleanCheckbox value="#{driver.documentReplaced}">                 
    <a4j:ajax execute="@this" listener="#{driver.makeChangeDriver}" render="..." />
</h:selectBooleanCheckbox>

另请参阅:

  • When to use valueChangeListener or f:ajax listener?

尽管如此,您可以在尝试中只传递 #{driver} 本身而不是它的哈希码。

<f:attribute name="driver" value="#{driver}" />

只是不必要的弯路