我使用可编辑的primefaces selectOneMenu来显示一些值。如果用户从列表中选择项目,则应更新文本区域。但是,如果用户在selectOneMenu中键入内容,则不应更新textarea。
我以为我可以用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}" />
答案 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
}