2012-05-28 3 views
3

У меня проблема с моим списком. Отображение источника и целей работает, но когда нажата команда, он вызывает установщика списка выбора и пустет источник и цель списка выбора. После этого он вызывает метод connectTags().Главный выборщик. Setter для DualListModel удаляет источник и цель

В чем причина такого поведения и как я могу это решить?

<h:form> 
    <p:pickList id="pickList" value="#{employeeEditController.dualListTags}" 
     var="tag" itemLabel="#{tag.value}" itemValue="#{tag}"> 
     <f:facet name="sourceCaption">Available</f:facet> 
     <f:facet name="targetCaption">Connected</f:facet> 
    </p:pickList> 
    <p:commandButton value="Save" actionListener="#{employeeEditController.connectTag()}"/> 
</h:form> 

Bean:

@Named(value = "employeeEditController") 
@SessionScoped 
public class EmployeeEditController implements Serializable, IEditController { 
    private Employee selectedEmployee; 
    private DualListModel<Tags> dualListTags; 

@Inject 
private EmployeeFacade employeeFacade; 
@Inject 
private CompanyFacade companyFacade; 
@Inject 
private TagFacade tagFacade; 

public void setSelectedEmployee(Employee selectedEmployee) { 
    System.out.println("setSelectedEmployee called. Value: " + selectedEmployee.getFirstName()); 
    this.selectedEmployee = selectedEmployee; 
    this.refreshDualList(); 
} 

private void refreshDualList(){ 
    List<Tags> source = (List<Tags>) this.getCompanyTags(); 
    List<Tags> target = (List<Tags>) this.getTags(); 
    System.out.println("refreshDualList called. \nSource: " + source.size() + 
      "Target: " + target.size()); 
    this.dualListTags = new DualListModel<Tags>(source, target); 
} 

public Collection<Tags> getTags(){ 
    Collection<Tags> retVal; 
    if(this.selectedEmployee != null){ 
     retVal = this.selectedEmployee.getTags(); 
     if(retVal == null){ 
      retVal = new ArrayList<Tags>(); 
     } 
    } else{ 
     System.out.println("selected emp is null"); 
     retVal = new ArrayList<Tags>(); 
    } 
    return retVal; 
} 

public Collection<Tags> getCompanyTags() { 
    Collection<Tags> retVal = new ArrayList<Tags>(); 
    if(this.companyID == null){ 
     String userstr = FacesContext.getCurrentInstance().getExternalContext().getRemoteUser(); 
     this.companyID = this.companyFacade.getCompanyIDByUser(userstr); 
    } 
    retVal = this.tagFacade.getTagsFromCompanyID(companyID); 
    return retVal; 
} 

public void save(){ 
    if(this.selectedEmployee != null){ 
     System.out.println("Save called. Value: " + this.selectedEmployee.getFirstName()); 
     this.employeeFacade.edit(this.selectedEmployee); 
    } 
} 

public void connectTag() { 
    if(this.dualListTags != null){ 
     System.out.println("connectTag() called.\n" + "source: " + this.dualListTags.getSource().size() + 
       "\ntarget: " + this.dualListTags.getTarget().size()); 
     this.selectedEmployee.setTags((Collection<Tags>)this.dualListTags.getTarget()); 
     this.save(); 
    } 
} 

public DualListModel<Tags> getDualListTags() { 
    System.out.println("getDualList called. \nSource :" + this.dualListTags.getSource().size() 
      + "\nTargets: " + this.dualListTags.getTarget().size()); 
    return this.dualListTags; 
} 

public void setDualListTags(DualListModel<Tags> dualListTags) { 
    System.out.println("setDualList called. \nSource :" + this.dualListTags.getSource().size() 
      + "\nTargets: " + this.dualListTags.getTarget().size()); 
    this.dualListTags = dualListTags; 
    System.out.println("setDualList called after set. \nSource :" + this.dualListTags.getSource().size() 
       + "\nTargets: " + this.dualListTags.getTarget().size()); 
    } 

} 
+2

Используется ли пример витрины? http://www.primefaces.org/showcase/ui/picklist.jsf Постройте дальше это шаг за шагом, пока он не сработает таким же образом, и у вас есть причина. – BalusC

+0

Метод connectTags получает источник и цель от дуаллиста, сохраненного в контроллере. Но setter вызывается и опустошает duallist – Klaasvaak

+0

Что означает 'connectTags()' return - это то, что возвращает JavaScript для запуска в браузере? – wrschneider

ответ

6

У меня была такая же проблема, и кажется, что решение является impement пользовательский конвертер для лица вы используете в списке выбора.

Это как мой пользовательский преобразователь выглядит следующим образом:

@ViewScoped 
@ManagedBean(name = "vehicleGroupConverter") 
public class VehicleGroupConverter implements Converter { 

    @ManagedProperty(value = "#{vehiclesBean}") 
    private VehiclesBean vehiclesBean; 

    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, 
      String value) { 
     long groupId = Long.parseLong(value); 
     List<AssetCategory> groups = vehiclesBean.getVehicleGroups(); 
     for (AssetCategory group : groups) { 
      if (group.getCategoryId() == groupId) { 
       return group; 
      } 
     } 
     return null; 
    } 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, 
      Object value) { 
     return Long.toString(((AssetCategory) value).getCategoryId()); 
    } 

    public void setVehiclesBean(VehiclesBean vehiclesBean) { 
     this.vehiclesBean = vehiclesBean; 
    } 

} 

И это шаблон Picklist часть:

<p:pickList id="vehicleGroups" 
     value="#{vehiclesBean.selectedVehicleGroups}" 
     var="group" 
     itemLabel="#{group.name}" 
     itemValue="#{group}" 
     converter="#{vehicleGroupConverter}" 
     styleClass="pf-panel-grid" 
     style="margin-bottom:10px"> 
    <f:facet name="sourceCaption">#{i18n['label-available-groups']}</f:facet> 
    <f:facet name="targetCaption">#{i18n['label-assigned-groups']}</f:facet> 
</p:pickList> 
+0

Почему 'Конвертер'' ManagedBean'? –

+0

В общем, нет причин для этого. Это было просто удобно в конкретном приложении, над которым я работал. –

1

Наборы duallistmodel, когда источник или цель не пуст:

public void setDualListTags(DualListModel<Tags> dualListTags) { 
    if(this.dualListTags.getSource().size()!=0 && this.dualListTags.getTarget().size()!=0) { 
     this.dualListTags = dualListTags; 
    } 
} 
Смежные вопросы