2015-06-02 8 views
1

Я осмотрел и не нашел решения.В списке выбора Primefaces, как найти, что элемент перемещен из TARGET в SOURCE, с использованием Omnifaces Converter

Я использую OmnifaceslistConverter в компоненте PickListPrimefaces. Когда я перемещаю предмет от ИСТОЧНИК до ЦЕЛЬ. В бэкэн-бэне я получаю новый товар ТОЛЬКО на 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, то все это работает наоборот.

ответ

2

Это, как я получил это работает для меня.

В реализации Omnifaces ListConverter, метод getAsObject использует list, чтобы найти значение и обновить target и source из dualList.

ПРИМЕЧАНИЕ: вы получите либо новое добавлены в target(List=".getSource") значение или новое добавлено в source(List=".getTarget") значение, в соответствии с List введенными вами значения.

Следовательно, изменяя List от myBean.dualList.getSource к myBean.completeList, я получаю обновленные target и source(т.е. старые значения + Добавлены новые значения + старые значения удаляются).

Если пользователь касается только нового добавленного в target или source, а не на, если какое-либо значение удаляется, то он должен использовать myBean.dualList.getSource и myBean.dualList.getTarget соответственно значение.

Однако, если пользователь хочет знать конечный контент, как он есть в моем случае, используйте всю коллекцию, то есть myBean.completeList.

Короче говоря, это List, который вы передаете в теге <o:conveter>.

Надеюсь, это поможет!

10

Для этого лучше использовать 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> 

Bean:

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 
    } 
} 
+0

Да, это решение. Но меня больше беспокоит, почему только использование Omnifaces ListConverter я не могу добиться того же. В этом случае каждый раз, когда пользователь передает, создается новый запрос ajax. – Ankit

+0

Я также могу написать пользовательский конвертер ... но не знаю, какой способ лучше ... пользовательский конвертер или ajax: подход к передаче – Ankit

+1

Если вы бросаете ajax на каждый пользовательский перенос, в вашем случае нет большого влияния на изменение, ajax лучше. Он сохраняет код более чистым и менее подвержен ошибкам. Кроме того, это оригинальное готовое решение от PrimeFaces, является частью API (таким образом, имеет поддержку ошибок/проблем от команды PrimeFaces), и вы не должны полагаться на внутреннюю реализацию. – olexd

 Смежные вопросы

  • Нет связанных вопросов^_^