选择菜单的ajax事件

37
我正在使用可编辑的PrimeFaces selectOneMenu来显示一些值。如果用户从列表中选择一个项目,则应更新文本区域。但是,如果用户在selectOneMenu中键入内容,则不应更新文本区域。
我认为我可以用ajax事件处理这个问题。然而,我不知道我可以在这里使用哪个事件。我只知道valueChange事件。是否有其他事件,例如onSelect或onKeyUp?
这是我的代码:
<p:selectOneMenu id="betreff" style="width: 470px !important;"  
            editable="true" value="#{post.aktNachricht.subject}">
            <p:ajax event="valueChange" update="msgtext"
                listener="#{post.subjectSelectionChanged}" />
            <f:selectItems value="#{post.subjectList}" />
</p:selectOneMenu>

<p:inputTextarea style="width:550px;" rows="15" id="msgtext"
        value="#{post.aktNachricht.text}" />
4个回答

70

PrimeFaces的ajax事件有时记录不够详细,所以大多数情况下你需要查看源代码并自行检查。

p:selectOneMenu支持change事件:

<p:selectOneMenu ..>
    <p:ajax event="change" update="msgtext"
        listener="#{post.subjectSelectionChanged}" />
    <!--...-->
</p:selectOneMenu>

触发带有 AjaxBehaviorEvent 参数的监听器:

public void subjectSelectionChanged(final AjaxBehaviorEvent event)  {...}

2
现在事件名称不是必需的,我们可以只使用 <p:ajax update="msgtext" listener="#{post.subjectSelectionChanged}" />。 - Himanshu Arora

13

我更愿意使用更方便的itemSelect事件。通过这个事件,你可以在监听器中使用org.primefaces.event.SelectEvent对象。

<p:selectOneMenu ...>
    <p:ajax event="itemSelect" 
        update="messages"
        listener="#{beanMB.onItemSelectedListener}"/>
</p:selectOneMenu>

使用这样的监听器:

public void onItemSelectedListener(SelectEvent event){
    MyItem selectedItem = (MyItem) event.getObject();
    //do something with selected value
}

3

请注意,在运行 selectOneMenu 组件之前,页面不包含任何带有 "required" 属性为 "true" 的空组件。
如果您使用了这样的组件:

<p:inputText label="Nm:" id="id_name" value="#{ myHelper.name}" required="true"/>

然后,
<p:selectOneMenu .....></p:selectOneMenu>

如果您忘记填写必填组件,selectoneMenu的ajax监听器将无法执行。


2

您可以检查您的 selectOneMenu 组件的值是否属于主题列表。

也就是说:

public void subjectSelectionChanged() {
    // Cancel if subject is manually written
    if (!subjectList.contains(aktNachricht.subject)) { return; }
    // Write your code here in case the user selected (or wrote) an item of the list
    // ....
}

据说subjectList是一种集合类型,就像ArrayList一样。当然,在这里,如果用户写入您的selectOneMenu列表项,您的代码将会运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接