p:使用鼠标从项目列表中选择时,自动完成值未设置值

时间:2015-12-22 15:51:13

标签: jsf jsf-2 primefaces

app以自动完成时设置的值开始。 当用键盘取消一些字母时,项目列表打开。 如果用键盘输入选择项目,则设置值。 如果用鼠标点击选择,则未设置值。 xhtml代码:

<h:form id="validateFormId">
    <p:autoComplete id="fieldA" value="#{autocompleteController.name}"
        completeMethod="#{autocompleteController.loadSuggestedValues}"
        autoHighlight="false" dropdown="true">
        <p:ajax event="change" process="@this" update="@form"
            listener="#{autocompleteController.triggerElement('ac')}" />
        <p:ajax event="itemSelect" process="@this" update="@form"
            listener="#{autocompleteController.triggerElement('ai')}" />
    </p:autoComplete>

</h:form>

豆:

@Named
@SessionScoped
public class AutocompleteController implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name = "start";

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public void triggerElement(String event) {
        System.out.println("trigger event: " + event);
        System.out.println("value: " + name);
    }

    public List loadSuggestedValues(String query) {
        List<String> values = new ArrayList<String>();
        values.add("aaa");
        values.add("bbb");
        values.add("ccc");
        values.add("ddd");
        values.add("eee");
        return values;
    }
}

试验: 1)取消一个字母并用键盘选择项目(第一个别名aaa):

trigger event: ai
value: aaa

2)取消一个字母并用鼠标选择项目(第一个别名aaa):

trigger event: ac
value: aa

3)用鼠标单击下拉列表并用鼠标选择项目(第一个别名aaa):

trigger event: ai
value: aaa

案例2是错误的。

建议这个问题?

2 个答案:

答案 0 :(得分:0)

这是因为change和itemselect事件都被一个接一个地触发,并且change事件优先于itemSelect事件

如果可见“自动完成”下拉列表,则不要继续进行更改事件 也就是说,将以下内容添加到更改事件行中以避免触发它,并仅调用项目选择事件。

onstart="if(PF('autoCompWidgy').panel.is(':visible')) return false;" />
       

自动完成的示例如下:

<p:autoComplete id="autoComplete" dropdown="true" value="#{reqdoc.documentType}" completeMethod="#{financeController.completeDocDesc}" forceSelection="true"
                rendered="#{empty reqdoc.documentKey}" widgetVar="autoCompWidgy">
                <p:ajax event="itemSelect" listener="#{financeController.userAddedDocumentListener(reqdoc)}" process="@this" update="reqDoctable" />
                <p:ajax event="change" listener="#{financeController.userAddedDocumentListener(reqdoc)}" process="@this" update="reqDoctable"
                  onstart="if(PF('autoCompWidgy').panel.is(':visible')) return false;" />
</p:autoComplete>

答案 1 :(得分:-1)

尝试在ajax 立即=&#34; true&#34;

<p:ajax event="itemSelect" process="@this" update="@form" immediate="true"
            listener="#{autocompleteController.triggerElement('ai')}" />