在Primefaces选项列表中,如何找到项目从TARGET移动到SOURCE,使用Omnifaces转换器

Ank*_*kit 1 jsf primefaces jsf-2 omnifaces

我环顾四周,无法找到解决方案.

我正在使用Omnifaces listConverterPickList组件Primefaces.当我将物品从SOURCE移动到TARGET时.在支持bean中,我只获得新项目dualList.getTarget().

但是当我将物品从TARGET移动到SOURCE时.在支持bean中,我无法检查是否已从TARGET中删除了某个项目.

我试过dualList.getSource()- SOURCE不包含从TARGET中删除的项目. 当然,dualList.getTarget()将为空(假设没有项目从SOURCE移动到TARGET).

我的问题是如何才能在支持bean中发现某些内容已从TARGET转移到SOURCE

以前我已经创建了一个自定义转换器,在那里,我dualList.getTarget()给了我更新的目标(即旧值+添加的新值+删除旧值).因此,我可以弄清楚哪些值被添加,删除并仍然存在.

但在使用Omnifaces listConverter时我并不了解如何实现它.

我的代码看起来像这样:

XHTML

<p:pickList id="pickList" value="#{assignBenchmarkersBean.dualUserList}" 
            var="users" itemLabel="#{users.username}" itemValue="#{users}" >
    <o:converter converterId="omnifaces.ListConverter" 
                 list="#{assignBenchmarkersBean.dualUserList.source}" />
</p:pickList>

<p:commandButton id="update" value="#{bundle.create}" 
                 styleClass="redButton bigFont" 
                 actionListener="#{assignBenchmarkersBean.update()}" />
Run Code Online (Sandbox Code Playgroud)

public void update(){
        try{
            prepareRemoveOldAndAddNewUsersList();
           /**some other code **/
        }catch(Exception e){
            FacesMsg.error(ErrorMessage.UPDATE.getValue(), e);
        }
    }

    private void prepareRemoveOldAndAddNewUsersList() {
        for(User user : dualUserList.getTarget()){      //add users
            addUsers.add(user);
        }
        for(User user : dualUserList.getSource()){      //remove users
            if(oldUserList.contains(user)){
                removeUsers.add(user);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

用户实体

@Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof User)) {
            return false;
        }
        User other = (User) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "com.abc.model.main.User[ id=" + id + " ]";
    }
Run Code Online (Sandbox Code Playgroud)

注意:

如果在转换器的list属性中,我放bean.dualList.target,然后整个事情反过来.

ole*_*exd 10

transferPrimeFaces用户指南中所述,最好为此目标使用ajax 事件.

XHTML:

<p:pickList id="pickList" value="#{assignBenchmarkersBean.dualUserList}" 
        var="users" itemLabel="#{users.username}" itemValue="#{users}" >
    <o:converter converterId="omnifaces.ListConverter" 
             list="#{assignBenchmarkersBean.dualUserList.source}" />
    <p:ajax event="transfer" listener="#{pickListBean.handleTransfer}" />
</p:pickList>
Run Code Online (Sandbox Code Playgroud)

豆:

public class PickListBean {
    //DualListModel code
    public void handleTransfer(TransferEvent event) {
        //event.getItems() : List of items transferred
        //event.isAdd() : Is transfer from source to target
        //event.isRemove() : Is transfer from target to source
    }
}
Run Code Online (Sandbox Code Playgroud)