p:按组自动完成 - 保存值

时间:2018-04-09 18:59:47

标签: jsf primefaces

我想在搜索引擎中插入基于以下内容的自动填充功能。亚型动物清单。我创建了这段代码:

 <p:outputLabel value="Animals subtype:" />
 <p:autoComplete id="animals" value="#{search.animalssubtype}" completeMethod="#{zonetable.completeAnimalSubtype}" />

(其中search.animalssubtype是value是搜索条件的值),一切正常。我现在想把它变成一个分组,这里出现“楼梯”。试着这样做:

<p:outputLabel value="Animals :" />
<p:autoComplete id="animals " value="#{search.animalssubtype}" completeMethod="#{zonetable.findAllAnimal}"
                 itemLabel="#{zonetable.findAllAnimal.subtype}" itemValue="#{zonetable.findAllAnimal.subtype}" 
                groupBy="#{zonetable.findAllAnimal.type}"/>

它工作正常,但在标签中我明白了:

Animal{id=1,type=01, subtype=011 ...} 

我试着这样做:

<p:outputLabel value="Animals :" />
<p:autoComplete id="animals " value="#{model.animal}" completeMethod="#{zonetable.findAllAnimal}"
                var="an" itemLabel="#{an.subtype}" itemValue="#{an.subtype}" 
                groupBy="#{an.type}"/>

(其中model.animal是新的实例对象Animal [Animal animal = new Animal()])并且标签显示正确,但我不知道如何将值保存到“search.animalssubtype”。你能告诉我怎么做吗?

1 个答案:

答案 0 :(得分:0)

我相信你需要使用converter来实现这一目标。 鉴于您的代码摘录,我无法发布任何有效的代码。但是,代码应该看起来像这样:

<p:outputLabel value="Animals :" />
<p:autoComplete id="animals"
                value="#{search.animalssubtype}"
                completeMethod="#{zonetable.findAllAnimal}"
                converter="#{animalConverter}
                itemLabel="#{animalssubtype.name}"
                itemValue="#{animalssubtype}"/>

这是转换器的一个例子:

@Named("animalConverter")
@RequestScoped
public class AnimalConverter implements Converter {

  @Inject
  private Service service;

  @Inject
  private Search search;

  @Override
  public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String s) {

    try {
      Long id = NumberUtils.createLong(s);
      if(id == null) {
        return search.getAnimal();
      }
      return service.find(id);
    } catch (NumberFormatException e) {
      // ignore!
      return search.getAnimal();
    }
  }

  @Override
  public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object o) {
    String result = "";
    if (o != null && o instanceof Animal) {
      Animal animal = (Animal) o;
      result = String.valueOf(animal.getId());
    }
    return result;
  }
}