当清除字段时,primefaces自动完成,在单击提交按钮时给出页面的先前结果

时间:2012-09-04 11:00:47

标签: jsf-2 primefaces

我正在使用主要面孔的自动完成标记,该标记从数据库中检索结果。

问题在于,当我提交表单时,自动填充字段为空,我在页面上获得的结果是先前请求的结果(先前选择的自动完成值) - 只有在我刷新页面时才会清除它。

我希望在每次提交时都不需要刷新浏览器页面,如果我使用退格键清除字段中的值并提交表单,它应该为此特定实例提供正确的结果,而不是之前的实例。

我也在jsf页面表单中使用了一些文本字段,但那些没有这个问题。 有人可以就如何纠正这个问题提供指导吗?

编辑: 代码:

<h:form>
  <h:dataTable id="Ressult" value="#{input.searchResults}" var="r">
    <h:column>#{r.ID}</h:column>
    <h:column>#{r.Name}</h:column>
  </h:dataTable>
  <tr>
    <td>Current Education Level</td>
    <td>
      <h:panelGrid styleClass="text-box">
        <p:autoComplete id="education" value="#{input.education}"
        completeMethod="#{input.getautocomplete}" var="a"
        itemLabel="#{a.Name}" itemValue="#{a}"
        converter="edConverter" forceSelection="true" />
        <p:column>#{a.Name} - #{a.id}</p:column>
      </h:panelGrid>
    </td>
  </tr>
  <tr>
    <td>City</td>
    <td>
      <h:selectOneMenu id="txtCity" styleClass="select-field"
      value="#{input.cityId}">
        <f:selectItem itemLabel=" Please Select" itemValue="0">
        </f:selectItem>
        <f:selectItems value="#{input.cities}"></f:selectItems>
      </h:selectOneMenu>
    </td>
  </tr>
  <tr>
    <td>Name of Person</td>
    <td>
      <h:inputText id="txtName" value="#{input.nameOfPerson}"
      styleClass="text-box"></h:inputText>
    </td>
  </tr>
  <h:commandButton id="btnSearch" value="Search"
  action="#{input.searching}">
    <f:ajax execute="@form" render="Ressult"></f:ajax>
  </h:commandButton>
</h:form>  

这是bean代码:

public class Input 
{
    private Education education;
    private List<SelectItem> cities;
    private Integer cityId;
    private String nameOfPerson;
    private List<Results> searchResults;
    //getters and setters

    public String searching()
    {
         searchResults=dao.getSearchResults(cityId,education,nameOfPerson);
         return "success";
    }

    public void autocomplete(String query)
    {
        //AUTOCOMPLTE lIST CODE HERE
    }
}

通过更新,如果您的意思是在选择新项目时显示新结果,那么是 - 表单应该更新,但自动完成以某种方式获取先前选择的值并根据该显示结果。至少在我刷新页面之前 - 只有那时才会删除自动完成的前一页。

6 个答案:

答案 0 :(得分:3)

我的自动完成小部件遇到了同样的问题。 当我删除它的id属性时,它工作。也许是Primefaces中的一个错误。

答案 1 :(得分:1)

您可能有两件事要做:

  1. 在表单中执行以下操作,按Enter键阻止用户提交:

    <h:form onkeypress="return event.keyCode != 13;">
    
  2. 使用提供的itemSelect / itemUnselect功能清空Bean中的字段:

    <p:ajax event="itemSelect"
        listener="#{autoCompleteBean.handleSelect}" global="false"
        update=":some:where" />
    
    <p:ajax event="itemUnselect"
        listener="#{autoCompleteBean.handleUnselect}" global="false"
        update=":some:where" />
    
    <!-- rest of your facelet stuff -->
    

  3. 在Bean中:

    public void handleSelect(final SelectEvent event) {
        final Search search = (Search) event.getObject();
        // do your addition here
    }
    
    public void handleUnselect(final UnselectEvent event) {
        final Search search = (Search) event.getObject();
        // do your substraction here
    }
    

答案 2 :(得分:0)

如果我正确理解了您的问题,那么在帖子后会显示您的自动完成列表。并且您使用表单一次又一次地提交到同一页面。

你的豆看起来有点奇怪。因为你在页面中调用了自动完成方法:getautocomplete,但你的bean中不存在。

以这种方式使用自动填充:

<p:autoComplete id="education" value="#{input.education}"  completeMethod="#{input.autocomplete}" var="a" itemLabel="#{a.Name}" itemValue="#{a}" converter="edConverter" forceSelection="true" />

在你的bean中:

public List<Education> autocomplete(String query)
{
        List<Education> educations = new ArrayList<Education>();
        //search with query in your dao something like:
        educations = dao.searchEducation(query);

        return educations;
}

答案 3 :(得分:0)

修复了5.2,升级你的primefaces jar

此处是日志问题

https://code.google.com/p/primefaces/issues/detail?id=7592

答案 4 :(得分:0)

要解决主题问题,您只需删除强制选择

即可

或将其视为假。

答案 5 :(得分:0)

将事件处理到服务器。使用forceselection =&#34; true&#34;

<p:ajax event="itemUnselect" global="false" />