3

ビュー スコープのマネージド Bean では、次<p:resetInput>のように、対応するマネージド Bean のプロパティが保持する値をクリアするために使用しています。

<p:commandButton value="Reset" update="panel" process="@this">
    <p:resetInput target="panel" />
</p:commandButton>

これはうまくいきます。


検証が成功した場合、送信ボタン<p:commandButton>を押すと、送信された値がデータベースに挿入されます。

<p:remoteCommand name="updateTable" update="dataTable"/>

<p:panel id="panel" header="New">
    <p:outputLabel for="property1" value="property1"/>

    <p:inputText id="property1" value="#{bean.property1}" required="true">
        <f:validateLength minimum="2" maximum="100"/>
    </p:inputText>

    <p:message for="property1" showSummary="false"/>

    <p:commandButton id="btnSubmit"
                     update="panel messages"
                     oncomplete="if(!args.validationFailed) {updateTable();}"
                     actionListener="#{bean.insert}"
                     value="Save"/>

    <p:commandButton value="Reset" update="panel" process="@this">
        <p:resetInput target="panel" />
    </p:commandButton>
</p:panel>

insert()コマンド ボタンは、次のように定義されているマネージド Bean 内のメソッドを呼び出します。

public void insert() {
    if (service.insert(property1)) {
        //...Popup a success message.
        reset(); //Invoke the following private method.
    } else {
        //...Show the cause of the failure.
    }
}

private void reset() {
    property1 = null; //Set this property of type String to null.
}

このreset()メソッドを省略し<p:inputText>た場合、明らかなようにクリアされませんが、XHTML に示されているようにリセット ボタンを押すと、<p:inputText>クリアされるはずですが、クリアされません。

ショーケースの例は、まったく同じことを示しています。したがって、この動作は文書化されているようですが、この場合、メソッドが省略されている場合、<p:resetInut>の値がクリアされない理由がわかりませんか?property1reset()

4

1 に答える 1

8

あなた<p:resetInput>が誤って期待していたように、 はモデル値をクリアしません。検証エラーの後にダーティである可能性がある入力コンポーネントの状態をクリアするだけです。

解決しようとしている具体的な問題は、この回答で詳細に説明されています: How can I populate a text field using PrimeFaces AJAX after validation errors occur?

これは、次の使用例で最もよく理解できます。

  1. 単一のデータテーブルと、編集用に現在選択されているレコードを表示する単一のダイアログを備えた単一のビューがあります。
  2. ダイアログを開き、無効な値を含むフォームを送信します。入力コンポーネントは無効とマークされ、赤色で強調表示されます。
  3. エラーを修正せずにダイアログを閉じます。
  4. 次に、同じ行または別の行を選択して編集します。ダイアログが表示されますが、入力コンポーネントは依然として無効としてマークされ、赤色で強調表示され、以前に送信された値 (存在する場合) が表示されます。

<p:resetInput>ダイアログを開く」ボタンのダイアログのフォームにターゲットを配置すると、それが修正されます。

あなたの特定のケースが<p:resetInput>適切なソリューションである適切なユースケースであるかどうかはわかりません。あなたのコードは完全ではなく、このコードの背後にある具体的な機能要件をどこにも述べていませんでしたが、私が見る限り、相互に更新する必要がある複数の入力/フォームはありません。を削除しても、あなたのケースは引き続き機能すると思います<p:resetInput>。したがって、コンテキストでは完全に不必要であり、モデルをクリアするだけで逃げることができます(または..ビューを暗黙的に再作成する同期GETボタンでページを更新するだけです)。

以下も参照してください。

于 2013-07-16T11:06:47.687 に答える