我找了很多地方都找不到解决办法。
我在Primefaces
的PickList
分量中使用Omnifaces
listConverter
。当我将项目从SOURCE移动到TARGET时。在后台bean中,我只在dualList.getTarget()
上获取新项目。
然而,当我移动一个项目从目标到源。在后台bean中,我无法检查是否已从TARGET中删除了一个项目。
I try dualList.getSource()
- SOURCE不包含从TARGET删除的项目/s当然, duallist . gettget ()将为空(假设没有项从SOURCE移动到TARGET)。
我的问题是我如何才能发现一些东西已经从TARGET移动到SOURCE中的支持bean?
以前我已经创建了一个自定义转换器,在其中,我的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用户指南中所述。
<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
查找dualList
的值并更新target
和source
。
说明:根据您输入的List
值,您将获得target
(List=".getSource")
或source
(List=".getTarget")
中添加的新值。
因此,通过将List
从myBean.dualList.getSource
更改为myBean.completeList
,我得到更新的target
和source
(即旧值+新值添加+旧值删除)。
如果用户只关心target
或source
中增加的新值,而不关心任何值被删除,那么他应该分别使用myBean.dualList.getSource
和myBean.dualList.getTarget
。
然而,如果用户想知道最终的内容,因为它是在我的情况下,使用整个集合,即myBean.completeList
。
简而言之,你在<o:conveter>
标签中传递的List
是重要的。
希望对你有帮助!