ユースケース:編集フォームに非常に重要な値があり、頻繁に変更する必要はありません。読み取り専用にし、横に「変更」ボタンを付けることにしました。このボタンをクリックすると、警告付きのダイアログがユーザーに表示され、この読み取り専用フィールドを変更できるようになります。(これはselectOneMenuです)
最初の試み:
<p:selectOneMenu
id="integrationCombo"
value="#{backendBean.integration.backend}"
widgetVar="backendIntegrationCombo"
disabled="true">
<f:selectItems
value="#{backendBean.backends}"
var="backend" itemValue="#{backend}"
itemLabel="#{backend.name}" />
</p:selectOneMenu>
<p:commandButton type="button"
styleClass="inlineTableCellButton"
onclick="backendIntegrationCombo.enable()"
value="#{msg['button.change']}" />
これによりコンボボックスが有効になりますが、彼の値はサーバーに送信されません(これは私が見つけたdisabled = trueによるものです)
2番目の試みは、ビュースコープのBeanに編集可能なブール値を設定し、disable = "#{!bean.editable}"を実行し、コマンドボタンを使用してsetEditable(true)を呼び出すことでした。これはうまく機能しましたが、理由は不明ですが、フォームを送信するコマンドボタンの保存アクションが機能しなくなりました。
3番目の試み:名前とコンボボックス(非表示のクラスを使用)を使用してh:outputTextをレンダリングし、変更ボタンをクリックした後、非表示のクラスを切り替えます。
function changeBackend() {
$("#backendName").addClass("hidden");
$("#integrationCombo_input").parent().parent().removeClass("hidden");
}
保存が完了した後、何もレンダリングされない(ouputTextもコンボボックスも)ということを除いて、これも問題なく機能します。