我使用的是可编辑primefaces selectOneMenu用于显示一些值。如果用户从列表中选择一个项目一个textarea应该更新。但是,如果用户键入的东西在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}" />
有时PrimeFaces AJAX事件很差记载,所以在大多数情况下,你必须去的源代码,并检查自己。
p:selectOneMenu
支持更改事件:
<p:selectOneMenu ..>
<p:ajax event="change" update="msgtext"
listener="#{post.subjectSelectionChanged}" />
<!--...-->
</p:selectOneMenu>
触发听者AjaxBehaviorEvent
为特征参数:
public void subjectSelectionChanged(final AjaxBehaviorEvent event) {...}
请注意该页面不包含您selectOneMenu用于组件运行前已经“必需的”属性为“真”的任何空组件。 如果您使用的组件如
<p:inputText label="Nm:" id="id_name" value="#{ myHelper.name}" required="true"/>
然后,
<p:selectOneMenu .....></p:selectOneMenu>
和忘记填写所需组件,selectOneMenu用于的AJAX听者不能被执行。
你可以检查你的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
清单的项目代码运行。
我宁愿使用更方便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
}