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

时间:2015-06-02 11:14:46

标签: jsf jsf-2 primefaces omnifaces

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

我在Omnifaces的{​​{1}}组件中使用listConverter PickList。当我将项目从 SOURCE 移动到 TARGET 时。在支持bean中,我只在Primefaces上获得新项目。

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

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

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

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

但在使用dualList.getTarget()时,我不了解如何实现它。

我的代码如下所示:

XHTML

Omnifaces listConverter

<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,那么整个过程就会起作用。

2 个答案:

答案 0 :(得分:10)

最好为此目标使用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
    }
}

答案 1 :(得分:2)

这就是我为它工作的方式。

在Omnifaces ListConverter的实施中,getAsObject方法正在使用list查找值并更新targetsource { {1}}。

注意:您将在dualList target中添加新值,或在(List=".getSource") source中添加新值,按照您输入的(List=".getTarget")值。

因此,通过将ListList更改为myBean.dualList.getSource,我会获得更新的myBean.completeListtarget (即旧值+新值)添加+旧值已删除)

如果用户只关注sourcetarget中添加的新值,而不关注是否删除了任何值,那么他应该使用sourcemyBean.dualList.getSource分别。

但是,如果用户想要了解我的最终内容,请使用整个集合,即myBean.dualList.getTarget

简而言之,您在myBean.completeList标记中传递的List非常重要。

希望它会有所帮助!!