14

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

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. 「新規」ボタンをクリックしても、間違ったデータが表示されます。

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

4

4 に答える 4

34

この問題は JSF 2 でも認識され、次の回答で詳細に説明されています: How can I populate a text field using PrimeFaces AJAX after validation errors occur? JSF 2 を使用していた場合は、OmniFaces または PrimeFaces を使用できたはずResetInputAjaxActionListenerです。<p:resetInput>resetValues="true"

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

どのコンポーネントが ajax でレンダリングされ、ajax で実行されていないかを判断するには、JSF 2 ではPartialViewContextメソッドを使用していましたが、ajax がまだ標準化されていない JSF 1.2 では使用できません。それを理解するには、RichFaces 固有の ajax API をいじる必要があります。頭の中でそれを言うことはできないので、クリアする必要があるコンポーネントをすでに知っていると仮定して、キックオフの例を次に示します。ポップアップのフォームに が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);
于 2013-01-17T13:34:02.817 に答える
1

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

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

于 2013-01-17T09:57:20.360 に答える