0

データベースから結果を取得する素顔のオートコンプリート タグを使用しています。

問題は、フォームを送信してオートコンプリート フィールドを空のままにすると、ページに表示される結果が以前のリクエスト (以前に選択したオートコンプリート値) のものになることです。ページを更新したときにのみクリアされます。

バックスペースを使用してフィールドの値をクリアし、フォームを送信すると、ブラウザページを更新せずに送信ごとに、前のものではなく、この特定のインスタンスに対して正しい結果が得られるはずです。

私は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>  

そして、ここにビーンコードがあります:

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
    }
}

更新によって、新しいアイテムが選択されたときに新しい結果が表示されることを意味する場合は、はい - フォームは更新される必要がありますが、オートコンプリートは何らかの方法で以前に選択された値を取得し、それに応じて結果を表示します。少なくともページを更新するまでは、オートコンプリートの以前のものが削除されます。

4

6 に答える 6

3

オートコンプリート ウィジェットでも同じ問題が発生しました。id 属性を削除すると、機能しました。おそらくPrimefacesのバグです。

于 2012-11-22T10:25:42.230 に答える
1

次の 2 つのことを行う必要があります。

  1. フォームで次のようにして、ユーザーが Enter キーを押して送信できないようにします。

    <h:form onkeypress="return event.keyCode != 13;">
    
  2. Bean のフィールドを空にするために提供された itemSelect/itemUnselect 機能を使用します。

    <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 -->
    

ビーンで:

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
}
于 2014-01-14T08:36:40.257 に答える
0

5.2 で修正、primefaces jar をアップグレード

ここでログの問題

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

于 2015-07-23T08:06:40.090 に答える
0

あなたの質問を正しく理解できれば、オートコンプリートのリストが投稿後に表示されます。そして、フォームを使用して同じページに何度も送信します。

あなたの豆は少し奇妙に見えます。ページで autocomplete メソッドを呼び出しているため: getautocomplete が、Bean には存在しません。

この方法でオートコンプリートを使用します。

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

そしてあなたの豆で:

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;
}
于 2012-09-05T15:14:27.980 に答える