在 Primefaces 选择列表中,如何使用 Omnifaces 转换器找到一个项目从 TARGET 移动到 SOURCE
In Primefaces picklist, how to find that an item is moved from TARGET to SOURCE, Using Omnifaces Converter
我环顾四周,找不到解决办法。
我在 Primefaces
的 PickList
组件中使用 Omnifaces
listConverter
。当我将项目从 SOURCE 移动到 TARGET 时。在支持 bean 中,我仅在 dualList.getTarget()
.
上获得新项目
然而,当我将项目从 TARGET 移动到 SOURCE 时。在支持 bean 中,我无法检查某个项目是否已从 TARGET 中删除。
我试过 dualList.getSource()
- SOURCE 不包含从 TARGET 删除的 item/s
当然 dualList.getTarget() 将是空的(假设没有项目从 SOURCE 移动到 TARGET)。
我的问题是我如何才能发现支持 bean 中的某些内容已从 TARGET 移动到 SOURCE ?
之前我创建了一个自定义转换器,我的 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 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
}
}
我就是这样得到它的。
在 Omnifaces ListConverter
的实现中,getAsObject
方法使用 list
查找值并更新 target
和 source
dualList
个。
注意:您将获得 target
(List=".getSource")
中添加的新值或 source
[=19 中添加的新值=],根据您输入的 List
值。
因此,通过将 List
从 myBean.dualList.getSource
更改为 myBean.completeList
,我得到更新的 target
和 source
(即旧的值 + 添加的新值 + 删除的旧值 )。
如果用户只关心 target
或 source
中添加的新值而不关心是否删除任何值,那么他应该使用 myBean.dualList.getSource
和 myBean.dualList.getTarget
分别。
但是,如果用户想知道我的最终内容,请使用整个集合,即 myBean.completeList
。
简而言之,您在 <o:conveter>
标签中传递的 List
很重要。
希望对您有所帮助!!
我环顾四周,找不到解决办法。
我在 Primefaces
的 PickList
组件中使用 Omnifaces
listConverter
。当我将项目从 SOURCE 移动到 TARGET 时。在支持 bean 中,我仅在 dualList.getTarget()
.
然而,当我将项目从 TARGET 移动到 SOURCE 时。在支持 bean 中,我无法检查某个项目是否已从 TARGET 中删除。
我试过 dualList.getSource()
- SOURCE 不包含从 TARGET 删除的 item/s
当然 dualList.getTarget() 将是空的(假设没有项目从 SOURCE 移动到 TARGET)。
我的问题是我如何才能发现支持 bean 中的某些内容已从 TARGET 移动到 SOURCE ?
之前我创建了一个自定义转换器,我的 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 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
}
}
我就是这样得到它的。
在 Omnifaces ListConverter
的实现中,getAsObject
方法使用 list
查找值并更新 target
和 source
dualList
个。
注意:您将获得 target
(List=".getSource")
中添加的新值或 source
[=19 中添加的新值=],根据您输入的 List
值。
因此,通过将 List
从 myBean.dualList.getSource
更改为 myBean.completeList
,我得到更新的 target
和 source
(即旧的值 + 添加的新值 + 删除的旧值 )。
如果用户只关心 target
或 source
中添加的新值而不关心是否删除任何值,那么他应该使用 myBean.dualList.getSource
和 myBean.dualList.getTarget
分别。
但是,如果用户想知道我的最终内容,请使用整个集合,即 myBean.completeList
。
简而言之,您在 <o:conveter>
标签中传递的 List
很重要。
希望对您有所帮助!!