編集可能なプライムフェイスの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}" />
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コンポーネントを実行する前に、「required」属性が「true」である空のコンポーネントがページに含まれていないことに注意してください。
次のようなコンポーネントを使用する場合
<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
のようなコレクション型です。もちろんここでは、ユーザーwritesselectOneMenu
リストの項目の場合にコードが実行されます。
もっと便利な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
}