2016-06-08 52 views
-2

我使用richfaces來獲得自動完成,但它不起作用。我在這裏研究了richfaces展示和QA,但是我無法實現它。我得到的控制檯上沒有錯誤信息,馬列表不爲空,與AutocompleteBase.js RichFaces的加載,JSF的richfaces自動完成不工作

我的XHTML:

... 
xmlns:a4j="http://richfaces.org/a4j" 
xmlns:rich="http://richfaces.org/rich" 
... 
<h:form> 
    <rich:autocomplete mode="cachedAjax" minChars="1" 
     autocomopleteMethod="#{autoCompleteBean.autocomplete}"/>   
</h:form> 
... 

我自動完成豆:

@Named 
@RequestScoped 
public class AutoCompleteBean { 

private List<String> autocompleteList; 
private List<Horse> horses; 

    @PostConstruct 
    private void init() { 
     autocompleteList = new ArrayList<String>(); 
     for (Hors horse : horses) { 
      autocompleteList.add(horse.getName()); 
     } 
    } 

    public List<String> autocomplete(String prefix) { 
     ArrayList<String> result = new ArrayList<>(); 
     for (Iterator<Horse> it = autocompleteList.iterator(); it.hasNext();) { 
      if (it.next().getName().startsWith(prefix)) { 
       result.add(it.next()); 
      } 
     } 
     return result; 
    } 
} 

HTML output img

+0

有沒有你的馬陣裏面點兒? – Jens

+1

*「不起作用」*請從開發者的角度闡述問題,而不是以最終用戶的視角來闡述。堆棧溢出是爲了支持網站開發者,而不是網站的最終用戶。例如。哪些Java代碼行被預期執行,哪些(不)預期值是變量保存的,HTTP有效負載是怎樣的,等等。 – BalusC

回答

0

應該autocompleteMethodautocom**o**pleteMethod,所以:

<h:form> 
    <rich:autocomplete mode="cachedAjax" minChars="1" 
     autocompleteMethod="#{autoCompleteBean.autocomplete}" /> 
</h:form> 

此外,在JSF2.0 here檢查@Named@ManagedBean註釋之間的差異。

整體修改後的代碼:

@ManagedBean // instead of @Named 
@RequestScoped 
public class AutoCompleteBean { 

    // sample initialization, ensure that the list has some values 
    @ManagedProperty(value = "#{someOtherBean.myHorses}") 
    private List<Horse> horses; 
    private List<String> autocompleteList; 

    public List<String> autocomplete(String prefix) { 
     ArrayList<String> result = new ArrayList<>(); 

     // don't use iterators unless you really need it 
     // also, you had errors in this part (it.next) 
     for (String s : autocompleteList) { 
      if (s.startsWith(prefix)) { 
       result.add(s); 
      } 
     } 
     return result; 
    } 

    @PostConstruct 
    public void init() { 
     for (Horse horse : horses) { 
      autocompleteList.add(horse.getName()); 
     } 
    } 

    public void setHorses(List<Horse> horses) { 
     this.horses = horses; 
    } 
} 

如果您正在使用faces-config.xml而不是註解的話,那應該是:

<managed-bean> 
    <managed-bean-name>autoCompleteBean</managed-bean-name> 
    <managed-bean-class>sample.package.AutoCompleteBean</managed-bean-class> 
    <managed-bean-scope>request</managed-bean-scope> 
    <managed-property> 
     <property-name>horses</property-name> 
     <value>#{someOtherBean.myHorses}</value> 
    </managed-property> 
</managed-bean> 
+0

謝謝@Emil你的第一個提示解決了所有問題! – JohnA

+0

@JohnA不客氣。使用IDE來幫助你。每個着名的Java EE IDE都有內容幫助,這將有助於您避免將來出現此類拼寫錯誤。 –

0

您應該在一次迭代中調用it.next()兩次,每次調用該方法時都會得到不同的元素。

+0

即使他應該得到每一秒的結果:D –

+0

不會產生感謝@Makhiel謝謝 – JohnA

+0

@JohnA你有'it.next()。getName()。startsWith(前綴)'和'result.add(it.next())'。您檢查的名稱與添加到結果中的名稱不同。 – Makhiel