JSF2/PrimeFaces ページに 2 つのラジオ ボタンがあり、選択に応じて inputText フィールドを有効/無効にする必要があります。
<h:form prependId="false">
<p:panelGrid id="notif">
<p:row id="notif1">
<p:column>
<h:outputText value="label" />
</p:column>
<p:column>
<p:selectOneRadio id="radiobuttons" value="#{state.radioStatus}" layout="pageDirection">
<f:selectItem itemLabel="enable" itemValue="enable" />
<f:selectItem itemLabel="disable" itemValue="disable" />
<p:ajax update="date" />
</p:selectOneRadio>
</p:column>
<p:column>
<p:inputText id="date" value="#{state.infoDate}" disabled="#{!state.checkStatus}" >
</p:inputText>
<p:inputText id="test" value="#{state.infoDateTest}">
</p:inputText>
</p:column>
</p:row>
</p:panelGrid>
</h:form>
また、これはすべてタブ内にありますが、生成されたhtmlをチェックすると、ネストされたフォームはありません。フィールドはタブのIDを取得するようですが、このように正しいようです(ajaxにID表記「tabView:date」を使用しようとすると機能しませんでした。)
問題は、ページに入ると、「実際の」テキスト フィールドがデフォルトで無効になっており、ラジオ ボタンが有効に設定されているときに有効にする必要があることです。ラジオボタンのステータスが更新されると、イベントがサーバー側に登録され、inputText フィールドが「視覚的に」有効になっていることがわかります (デフォルトでは無効になっています)。ただし、有効にした後、フィールドは「フォーカス可能」ではないため、書き込むことはできません。
「テスト」inputTextフィールドを追加すると、さらに奇妙になります。これは、ラジオボタンに関して自己有効化/無効化されません。新しいページの読み込みでは書き込みはできますが、ラジオ ボタンのステータスを変更した後は書き込みができなくなります (ajax 呼び出しの前に入力されたテキストは残りますが、編集はできません)。
ただし、ラジオ ボタンは引き続き機能し、サーバー側でイベントを発生させます。
誰かが私が間違っていることを指摘できますか、それとも PrimeFaces のバグでしょうか?
// 更新前述のように、マネージド Bean は想定どおりに動作するため、問題は見られませんが、コードは次のとおりです (関連する部分がより大きなコンテキストから取得されるため、読みやすくするために簡略化され、名前が変更されています)。
@ManagedBean(name = "state")
@SessionScoped
public class ExampleBean implements Serializable {
private static final String disable = "disable";
private static final String enable = "enable";
private String text;
private List<TestRow> rows = null;
private TestRow row = null;
private String radioStatus = "enable";
private String infoDate = "";
private String infoDateTest = "";
@PostConstruct
public void initEmpty() {
}
public String getRadioStatus() {
return this.radioStatus;
}
public void setRadioStatus(String radioStatus) {
this.radioStatus = radioStatus;
}
public String getInfoDate() {
return infoDate;
}
public void setInfoDate(String infoDate) {
this.infoDate = infoDate;
}
public String getInfoDateTest() {
return infoDateTest;
}
public void setInfoDateTest(String infoDateTest) {
this.infoDateTest = infoDateTest;
}
public boolean isCheckStatus() {
return this.radioStatus.equalsIgnoreCase(enable) ? true : false;
}
}