[英]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.