[英]In Primefaces picklist, how to find that an item is moved from TARGET to SOURCE, Using Omnifaces Converter
我环顾四周,找不到解决方案。
我使用Omnifaces
listConverter
在PickList
的组件Primefaces
。 当我将一个项目从SOURCE移到TARGET时 。 在支持bean中,我仅在dualList.getTarget()
上获得新项。
但是,当我将项目从TARGET移到SOURCE时 。 在支持bean中,我无法检查是否已从TARGET中删除了一个项目。
我尝试了dualList.getSource()
- SOURCE不包含从TARGET放下的项目,当然, dualList.getTarget()将为空(假设没有项目从SOURCE移到TARGET)。
我的问题是我怎么能发现支持bean中的某些东西已从TARGET移到SOURCE ?
以前,我创建了一个自定义转换器,在dualList.getTarget()
,我的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
,那么整个事情bean.dualList.target
的方式工作。
如《 PrimeFaces用户指南》中所述,最好将ajax transfer
事件用于此目标。
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
查找值并更新dualList
的target
和source
。
注意 :您将获得无论是在增加了新的价值target
(List=".getSource")
或增加了新的价值source
(List=".getTarget")
按照该List
值已输入。
因此,通过将List
从myBean.dualList.getSource
为myBean.completeList
,可以获取更新的target
和source
(即旧值+添加的新值+删除的旧值) 。
如果用户只关心添加到target
或source
的新值,而不关心是否删除了任何值, myBean.dualList.getTarget
分别使用myBean.dualList.getSource
和myBean.dualList.getTarget
。
但是,如果用户想了解最终的内容,请使用整个集合,即myBean.completeList
。
简而言之,在<o:conveter>
标记中传递的List
很重要。
希望对您有所帮助!!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.