我环顾四周,无法找到解决方案。
我在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
,那么整个过程就会起作用。
答案 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
查找值并更新target
和source
{ {1}}。
注意:您将在dualList
target
中添加新值,或在(List=".getSource")
source
中添加新值,按照您输入的(List=".getTarget")
值。
因此,通过将List
从List
更改为myBean.dualList.getSource
,我会获得更新的myBean.completeList
和target
(即旧值+新值)添加+旧值已删除)。
如果用户只关注source
或target
中添加的新值,而不关注是否删除了任何值,那么他应该使用source
和myBean.dualList.getSource
分别。
但是,如果用户想要了解我的最终内容,请使用整个集合,即myBean.dualList.getTarget
。
简而言之,您在myBean.completeList
标记中传递的List
非常重要。
希望它会有所帮助!!