3

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;
    }
}
4

1 に答える 1

0

残念ながら、実際の問題の原因を突き止めることができませんでした。基本的なことは、継承された javascript (primefaces) がこのページで正しく機能していないようです (継承された他の js が原因である可能性があります)。最後に、カスタムの有効化/無効化 js 関数にしました。

js.toggleDisableStatus = function(elementId) {

// Can't use jQuery $("#xx:yy"), the syntax is not accepted by jquery but
// used by JSF/PrimeFaces
var element = document.getElementById(elementId);
var attrValue = element.getAttribute('disabled');
if (attrValue === undefined || attrValue == null) {
    element.disabled = true;
    element.style.background = "#dddddd";
} else {
    element.removeAttribute('disabled');
    element.style.background = "";
}
};

これには欠陥があるかもしれませんが、今のところ機能します。ラジオ ボタンは永続化された状態 (ロードされた状態) によって選択され、入力フィールドの有効/無効状態もページを最初にロードするときに設定されます。一般的に、これはこの特定のケースでうまくいくはずだと思います。

于 2013-10-15T10:27:15.813 に答える