如何根据primefaces中的另一个自动完成显示一个自动完成?

时间:2013-01-09 06:08:25

标签: autocomplete primefaces

我正在使用两个自动完成组件。第一个显示所有汽车公司(例如:本田,福特...)和另一个自动完成必须显示汽车模型取决于首选自动完成的选定汽车公司。 (如果我在第一次自动完成时选择本田,第二次自动完成应该只显示本田汽车模型(例如:城市,公民...))。

1 个答案:

答案 0 :(得分:0)

最简单的例子我可以想出:

<h:form>
    <p:autoComplete value="#{bean.make}"
        completeMethod="#{bean.completeMake}">
        <p:ajax event="itemSelect" />
    </p:autoComplete>
    <p:autoComplete value="#{bean.model}"
        completeMethod="#{bean.completeModel}" />
</h:form>

p:ajax是调用make的setter所必需的。

省略了支持bean(getters / setters):

@ManagedBean
@ViewScoped
public class Bean
{
    private List<String> makes = new ArrayList<String>();
    private Map<String, List<String>> makeModelMap = new HashMap<String, List<String>>();
    private String make, model;

    @PostConstruct
    private void init()
    {
        makes.add("Honda");
        List<String> hondaModels = new ArrayList<String>();
        hondaModels.add("Civic");
        hondaModels.add("City");
        makeModelMap.put("Honda", hondaModels);

        makes.add("Ford");
        List<String> fordModels = new ArrayList<String>();
        fordModels.add("T");
        fordModels.add("Focus");
        makeModelMap.put("Ford", fordModels);
    }

    public List<String> completeMake(String query)
    {
        List<String> results = new ArrayList<String>();
        for (String s : makes)
        {
            if (s.toLowerCase().startsWith(query.toLowerCase()))
            {
                results.add(s);
            }
        }
        return results;
    }

    public List<String> completeModel(String query)
    {
        List<String> results = new ArrayList<String>();
        for (String s : makeModelMap.get(make))
        {
            if (s.toLowerCase().startsWith(query.toLowerCase()))
            {
                results.add(s);
            }
        }
        return results;
    }
}