Primefaces,自动完成,多种模式。如何避免两次选择相同的项目?

时间:2014-07-30 20:11:37

标签: jsf primefaces

我知道我不能直接在Primefaces中做到这一点,我知道我必须在转换器中这样做,但是不知道在哪个阶段以及如何?我应该检查什么? 也许这样做我需要楔入JSF的生命周期?例如,在p:自动完成后,在“应用请求值阶段”中添加要列出的项目,我应检查是否存在重复项目并在“更新模型值阶段”之前将其删除,如果我以正确的方式理解JSF生命周期? 有可能吗? 提前谢谢。

2 个答案:

答案 0 :(得分:10)

可能,您需要做的是为每个用户的选择/取消选择保持模型的最新状态。使用<p:ajax />标记完成了<p:autoComplete />,因此所选项目的List将在后端更新。稍后,当用户请求其他查询时,请注意List

使用List String个值查看此SSCCE(您可能选择使用Converter或不使用自定义类,但这样做了与你的问题完全无关):

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:p="http://primefaces.org/ui">
<h:head />
<h:body>
    <h:form>
        <p:outputLabel value="Multiple:" />
        <p:autoComplete multiple="true"
            value="#{autoCompleteBean.selectedItems}"
            completeMethod="#{autoCompleteBean.completeItem}" var="it"
            itemLabel="#{it}" itemValue="#{it}" forceSelection="true">
            <p:ajax event="itemSelect" />
            <p:ajax event="itemUnselect" />
            <p:column>
                <h:outputText value="#{it}" />
            </p:column>
        </p:autoComplete>
    </h:form>
</h:body>
</html>
@ManagedBean
@ViewScoped
public class AutoCompleteBean {

    /**
     * The items currently available for selection
     */
    private List<String> items = new ArrayList<String>();

    /**
     * Current selected items
     */
    private List<String> selectedItems = new ArrayList<String>();

    /**
     * All the items available in the application
     */
    private List<String> allItems = new ArrayList<String>();

    /**
     * Create a hardcoded set of items and add all of them for selection
     */
    public AutoCompleteBean() {
        allItems.add("item1");
        allItems.add("item2");
        allItems.add("item3");
        allItems.add("item4");
        items.addAll(allItems);
    }

    /**
     * Check the current user query for selection. If it fits any of the items
     * of the system and it's not already selected, add it to the filtered List
     * 
     * @param query
     * @return
     */
    public List<String> completeItem(String query) {
        List<String> filteredList = new ArrayList<String>();
        for (String item : allItems) {
            if (item.startsWith(query) && !selectedItems.contains(item)) {
                filteredList.add(item);
            }
        }
        return filteredList;
    }

    public List<String> getItems() {
        return items;
    }

    public List<String> getSelectedItems() {
        return selectedItems;
    }

    public void setSelectedItems(List<String> selectedItems) {
        this.selectedItems = selectedItems;
    }

}

答案 1 :(得分:0)

当前版本的PrimeFaces(6.2.x)具有此问题的“唯一”属性。