33

我正在使用可编辑的 primefaces selectOneMenu 来显示一些值。如果用户从列表中选择一个项目,则应该更新文本区域。但是,如果用户在 selectOneMenu 中键入内容,则不应更新 textarea。

我想我可以用 ajax 事件来解决这个问题。但是,我不知道我可以在这里使用哪个事件。我只知道valueChange事件。是否还有其他事件,例如onSelectonKeyUp

这是我的代码:

<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

4 回答 4

66

PrimeFaces ajax 事件有时没有很好的文档记录,因此在大多数情况下,您必须查看源代码并自行检查。

p:selectOneMenu支持更改事件:

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

AjaxBehaviorEvent在签名中使用 as 参数触发侦听器:

public void subjectSelectionChanged(final AjaxBehaviorEvent event)  {...}
于 2014-02-07T09:21:31.657 回答
9

我宁愿使用更方便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
}
于 2018-11-27T15:57:11.220 回答
3

请注意,在您的 selectOneMenu 组件运行之前,该页面不包含任何具有“required”属性为“true”的空组件。
如果您使用诸如

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

然后,

<p:selectOneMenu .....></p:selectOneMenu>

忘记填写需要的组件,selectoneMenu的ajax监听器无法执行。

于 2015-11-30T15:25:02.293 回答
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

于 2013-09-27T10:59:44.487 回答