2016-06-08 91 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