【问题标题】:Primefaces 5: get value not in list from autocompletePrimefaces 5:从自动完成中获取不在列表中的值
【发布时间】:2015-09-10 12:47:12
【问题描述】:

是否有可能从自动完成组件中获取不在列表中的值? 我必须允许用户从列表中选择一个元素或添加新元素。

我的自动完成是这样的:

        <p:autoComplete  
        id="auto"
        value="#{bean.myobject}"
        completeMethod="#{bean.autoComplete()}"
        var="myvar"
        converter="myConverter"
        itemValue="#{myvar}"
        itemLabel="#{myvar.description}">

        <p:ajax event="itemSelect" listener="#{bean.handleSelect}">
        </p:ajax>
        <p:ajax event="change" listener="#{bean.action}">
        </p:ajax>
    </p:autoComplete>

在我的 bean 中,handleSelect 方法与列表中的对象完美配合。

相反,Action 方法不会从列表中获取值。

方法动作是这样的:

    public void action(AjaxBehaviorEvent e) {

    //FIRST SOLUTION
    AutoComplete anAutoComplete = (AutoComplete) e.getComponent();
    String aSelection = anAutoComplete.getValue().toString();
    System.out.println(aSelection);

    //SECOND SOLUTION
    FacesContext context = FacesContext.getCurrentInstance();
    UIComponent current = UIComponent.getCurrentComponent(context);
    Map<String, Object> attrMap = current.getAttributes();
    String test = (String) attrMap.get("auto");
    System.out.println(test);
}

两种解决方案都不起作用(变量 aSelection 和 test 都为空)。 我的错误在哪里? 谢谢。

【问题讨论】:

  • 您想在您的操作方法中从自动完成中选择项目吗?
  • 不,如果用户对不在列表中的单词进行数字输入,我想要获取该值,以便在列表中的该值之后添加...
  • “如果用户数字一个不在列表中的单词”你能详细说明一下吗
  • 如果我的列表包含“Cat”和“Dog”以及用户数字“Bird”,我想在我的 bean 中获取“Bird”的值......所以我可以添加“Bird”列表...

标签: jquery jsf primefaces autocomplete


【解决方案1】:

为了获得用户数字化文本的值,您必须访问“#{bean.myobject}”。您可以在其中保存此信息。因此,在您的 BackingBean Method 操作中:

public void action(AjaxBehaviorEvent e) {

...
String aSelection = myObject.toString();
System.out.println(aSelection); ....}

获取用户数字化的每个值的类似示例,无论是否在自动完成列表中。此代码有效。在 xhtml 中:

<p:autoComplete  
    id="auto"
    value="#{bean.text}"
    completeMethod="#{bean.autoComplete}"
  >
   <p:ajax event="change" listener="#{bean.action}">
   </p:ajax>
</p:autoComplete>

在名为“bean”的支持bean中:

private String text;

   public String getText() {
    return text;
}

public void setText(String text) {
    this.text = text;
}

public void action(AjaxBehaviorEvent e) {

        String aSelection = text.toString();
        System.out.println(aSelection);

    }

public List<String> autoComplete(String query) {
    List<String> results = new ArrayList<String>();
    for(int i = 0; i < 10; i++) {
        results.add(query + i);
    }

    return results;
}

【讨论】:

  • 如果元素不在列表中,aSelection 为空...所以应用程序抛出 NullPointerException.. :-(
  • 我已经编辑了答案以显示我使用的代码。每次用户更改它时,您都将值存储在 bean 属性中。该值不为空,可以使用
  • 您的示例有效,因为您没有对象而是字符串(所以我相信)。我解决了更改转换器的问题,我管理不在列表中的值。无论如何,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-29
  • 1970-01-01
  • 2014-11-12
  • 1970-01-01
  • 2022-07-10
  • 1970-01-01
相关资源
最近更新 更多