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

In Primefaces picklist, how to find that an item is moved from TARGET to SOURCE, Using Omnifaces Converter

我环顾四周,找不到解决办法。

我在 PrimefacesPickList 组件中使用 Omnifaces listConverter。当我将项目从 SOURCE 移动到 TARGET 时。在支持 bean 中,我仅在 dualList.getTarget().

上获得新项目

然而,当我将项目从 TARGET 移动到 SOURCE 时。在支持 bean 中,我无法检查某个项目是否已从 TARGET 中删除。

我试过 dualList.getSource() - SOURCE 不包含从 TARGET 删除的 item/s 当然 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()}" />

豆子

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

用户实体

@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 + " ]";
    }

注意:

如果在转换器的 list 属性中,我输入 bean.dualList.target,那么整个事情就会反过来。

最好使用 ajax transfer 事件来实现此目标,如 PrimeFaces User Guide 中所述。

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>

豆子:

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

我就是这样得到它的。

在 Omnifaces ListConverter 的实现中,getAsObject 方法使用 list 查找值并更新 targetsource dualList 个。

注意:您将获得 target (List=".getSource") 中添加的新值或 source [=19 中添加的新值=],根据您输入的 List 值。

因此,通过将 ListmyBean.dualList.getSource 更改为 myBean.completeList,我得到更新的 targetsource (即旧的值 + 添加的新值 + 删除的旧值 )

如果用户只关心 targetsource 中添加的新值而不关心是否删除任何值,那么他应该使用 myBean.dualList.getSourcemyBean.dualList.getTarget 分别。

但是,如果用户想知道我的最终内容,请使用整个集合,即 myBean.completeList

简而言之,您在 <o:conveter> 标签中传递的 List 很重要。

希望对您有所帮助!!