selectOneMenu ajax事件

时间:2013-05-16 12:34:43

标签: ajax jsf primefaces

我使用可编辑的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 个答案:

答案 0 :(得分:60)

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

p:selectOneMenu支持更改事件:

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

AjaxBehaviorEvent作为签名中的参数触发侦听器:

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

答案 1 :(得分:3)

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

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

然后,

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

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

答案 2 :(得分: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列表中的项目,您的代码将会运行。

答案 3 :(得分:1)

我宁愿使用更方便的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
}