Я осмотрел и не нашел решения.В списке выбора Primefaces, как найти, что элемент перемещен из TARGET в SOURCE, с использованием Omnifaces Converter
Я использую Omnifaces
listConverter
в компоненте PickList
Primefaces
. Когда я перемещаю предмет от ИСТОЧНИК до ЦЕЛЬ. В бэкэн-бэне я получаю новый товар ТОЛЬКО на dualList.getTarget()
.
Однако при перемещении элемента из TARGET к ИСТОЧНИК. В бэкэнде я не могу проверить, был ли элемент удален из TARGET.
Я попытался dualList.getSource()
- ИСТОЧНИК не содержит вопрос/s упал с TARGET и, конечно, dualList.getTarget() будет пустым (при условии, что ни один элемент не перемещается от источника к цели).
Мой вопрос, как я могу найти что-то было перемещено из 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()}" />
Bean
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
, то все это работает наоборот.
Да, это решение. Но меня больше беспокоит, почему только использование Omnifaces ListConverter я не могу добиться того же. В этом случае каждый раз, когда пользователь передает, создается новый запрос ajax. – Ankit
Я также могу написать пользовательский конвертер ... но не знаю, какой способ лучше ... пользовательский конвертер или ajax: подход к передаче – Ankit
Если вы бросаете ajax на каждый пользовательский перенос, в вашем случае нет большого влияния на изменение, ajax лучше. Он сохраняет код более чистым и менее подвержен ошибкам. Кроме того, это оригинальное готовое решение от PrimeFaces, является частью API (таким образом, имеет поддержку ошибок/проблем от команды PrimeFaces), и вы не должны полагаться на внутреннюю реализацию. – olexd