简体   繁体   English

带有inputText的Primefaces pickList不起作用

[英]Primefaces pickList with inputText not working

I'm trying to add an inputText field to my primefaces pickList, but I've got some problems with it. 我试图将inputText字段添加到我的primefaces pickList中,但是我遇到了一些问题。

At first: I can't write in the textField with a normal left-click. 一开始:我无法通过常规的左键单击在textField中进行编写。 I have to right click to be able to type in the textField. 我必须右键单击才能输入textField。

Second: It doesn't seem to save the value from the textField to the corresponding entity. 第二:似乎没有将值从textField保存到相应的实体。

My case: 我的情况:

<h:form id="pickListForm">
        <p:pickList converter="primeFacesPickListConverter" id="pickList" value="#{locodeBackingBean.locodes}"
                    var="locode" showCheckbox="true"
                    itemValue="#{locode.id}">
            <f:facet name="sourceCaption">#{msgs['locode.not.infected']}</f:facet>
            <f:facet name="targetCaption">#{msgs['locode.infected']}</f:facet>
            <p:column style="width:70%;">
                <h:outputText value="#{locode.description}"/>
            </p:column>
            <p:column style="width:30%">
                <p:inputText value="#{locode.incubationPeriod}"/>
            </p:column>
        </p:pickList>
        <p:commandButton value="#{msgs.save}" action="#{locodeBackingBean.save()}" update="growl"/>
    </h:form>

My backing bean: 我的支持豆:

@ManagedBean
@ViewScoped
public class LocodeBackingBean implements Serializable {
   private static final long serialVersionUID = 1L;

   @Inject
   private transient LocodeRepositoryBean locodeRepository;

   private DualListModel<Locode> locodes = new DualListModel<>();

   public void save() {
    for (Locode locode : locodes.getTarget()) {
        locode.setInfectedArea(true);
        locodeRepository.save(locode);
    }

    for (Locode locode : locodes.getSource()) {
        locode.setInfectedArea(false);
        locodeRepository.save(locode);
    }
    addFacesMessage("locode.action.saved");
   }

   @PostConstruct
   public void search() {
    List<Locode> source = locodeRepository.findAllNotInfected(locodeSearchCriteria);;
    List<Locode> target locodeRepository.findAllInfected(locodeSearchCriteria);
    locodes.setSource(source);
    locodes.setTarget(target);
   }


   public DualListModel<Locode> getLocodes() {
    return locodes;
   }

   public void setLocodes(DualListModel<Locode> locodes) {
    this.locodes = locodes;
   }

And to be complete, my converter: 最后,我的转换器:

@FacesConverter(value = "primeFacesPickListConverter")
public class PrimeFacesPickListConverter<T extends Domain> implements Converter {

   @Override
   public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
    if (arg1 instanceof PickList) {
        Object dualList = ((PickList) arg1).getValue();
        DualListModel dl = (DualListModel) dualList;
        for (Object o : dl.getSource()) {
            if (equalsById(arg2, o)) return o;
        }

        for (Object o : dl.getTarget()) {
            if (equalsById(arg2, o)) return o;
        }
    }
    throw new PrimeFacesPickListConverterException("Could not match object's id (" + arg2 + ") to any id's in the list.");
   }

   private boolean equalsById(String arg2, Object o) {
    String id = String.valueOf((((T) o)).getId());
    return arg2.equals(id);
   }

   @Override
   public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
    return String.valueOf(arg2);
   }

using PrimeFaces 5.2 使用PrimeFaces 5.2

Picklists in general are not intended to contain 'controls'. 通常,选择列表不包含“控件”。 So it was never designed to work this way and if it does not work, that is just unfortunate. 因此,它从来没有设计过以这种方式工作,如果不起作用,那就太不幸了。 Redesigning your ui is the only thing to do. 重新设计用户界面是唯一要做的事情。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM