web-dev-qa-db-ja.com

入力フィールドは、検証が失敗した場合にのみ以前の値を保持します

私は奇妙な問題を思いついた。私は問題を切り分けようとしたので、以下は私の簡略化されたコードです。

public class MyBean {

  private List<Data> dataList;
  Data selectedData;

  public MyBean() {
    dataList = new ArrayList<Data>();
    dataList.add(new Data("John", 16));
    dataList.add(new Data("William", 25));
  }

  public List<Data> getDataList() {
    return dataList;
  }

  public void edit(Data data) {
    selectedData = data;
  }
  public void newData() {
    selectedData = new Data(null, null);
  }

  public Data getSelectedData() {
    return selectedData;
  }

  public class Data {
    String name;
    Integer age;
    Data(String name, Integer age) {
      this.name = name;
      this.age = age;
    }
    public String getName() {
      return name;
    }
    public void setName(String name) {
      this.name = name;
    }
    public Integer getAge() {
      return age;
    }
    public void setAge(Integer age) {
      this.age = age;
    }
  }
}

xhtml:

<rich:modalPanel id="pop">
  <h:form>
    Name: <h:inputText value="#{myBean.selectedData.name}" required="true" id="txtName"/><br/>
    Age : <h:inputText value="#{myBean.selectedData.age}" required="true" id="txtAge"/>
    <a4j:commandButton value="Save"/>
    <a4j:commandButton value="Close" onclick="Richfaces.hideModalPanel('pop');return false;"/>
    <br/>
    <rich:message for="txtName"/><br/>
    <rich:message for="txtAge"/>
  </h:form>     
</rich:modalPanel>

<h:form>
  <rich:dataTable value="#{myBean.dataList}" var="data">
    <rich:column>#{data.name}</rich:column>
    <rich:column>
      <a4j:commandLink value="Edit" action="#{myBean.edit(data)}" reRender="pop" oncomplete="Richfaces.showModalPanel('pop')"/>
    </rich:column>
  </rich:dataTable>
  <a4j:commandButton value="New" action="#{myBean.newData()}" reRender="pop" oncomplete="Richfaces.showModalPanel('pop')"/>
</h:form>

これはエラーへのパスです:

  1. ページを読み込む
  2. 最初の行の[編集]リンクをクリックします(ポップアップ表示)
  3. ポップアップで、[年齢]フィールドをクリアし、[保存]をクリックします(必要なメッセージが表示されます)
  4. [キャンセル]をクリックします([年齢]フィールドに入力せずに)
  5. 2番目のリンクをクリックします。
  6. これで、無関係なデータ(以前のデータ)が表示されます。 - これが問題です
  7. 「新規」ボタンをクリックしても、間違ったデータが表示されます。

これは、ポップアップで検証が失敗した場合にのみ発生します。
これに対する解決策はありますか?

13
prageeth

この問題はJSF2でも認識され、次の回答で詳細に説明されています。 検証エラーが発生した後にPrimeFaces AJAXを使用してテキストフィールドに入力するにはどうすればよいですか? JSF 2を使用していた場合は、OmniFaces ' ResetInputAjaxActionListener またはPrimeFaces' _<p:resetInput>_または_resetValues="true"_ を使用できます。

要するに、ajaxレンダリングされようとしているが、ajax-executeには含まれていないときに、 EditableValueHolder コンポーネントの状態をクリアする必要があります。状態をクリアするには、JSF 2でコンビニエンスメソッド resetValue() を使用しますが、これはJSF 1.2では使用できないため、4つの個別のメソッドを呼び出す必要があります。 setValue(null)setSubmittedValue(null)setLocalValueSet(false)setValid(true)で状態をクリアします。

どのコンポーネントがajaxでレンダリングされるが、ajaxで実行されないかを判断するには、JSF2でPartialViewContextメソッドを使用しますが、これはJSF1.2では使用できません。まだ標準化されたajax。それを理解するには、RichFaces固有のajaxAPIをいじる必要があります。頭のてっぺんからはわかりません。クリアする必要のあるコンポーネントをすでに知っていると仮定して、キックオフの例を示します。ポップアップのフォームに_id="popForm"_があり、名前入力フィールドに_id="nameInput"_があると想像してください。これは、newData()メソッド内でフォームをクリアする方法です。

_UIInput nameInput = (UIInput) context.getViewRoot().findComponent("popForm:nameInput");
nameInput.setValue(null);
nameInput.setSubmittedValue(null);
nameInput.setLocalValueSet(false);
nameInput.setValid(true);
_
31
BalusC

キャンセルアクションで1つのことを行い、すべてのポップアップ値をnullに設定します。次に、デフォルトに設定されているすべての値をクリックします。

またはクリックすると、以前のすべての値をnullに設定します。その後、それぞれの値をすべて設定します。

1
durgesh6121

私も同じ問題を抱えていました。 Primefacesを使用している場合、解決策は、選択したアイテムをロードするp:commandLinkまたはp:commandButtonにresetValues="true"を配置するだけです。

1
hendinas