私は奇妙な問題を思いついた。私は問題を切り分けようとしたので、以下は私の簡略化されたコードです。
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>
これはエラーへのパスです:
これは、ポップアップで検証が失敗した場合にのみ発生します。
これに対する解決策はありますか?
この問題は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);
_
キャンセルアクションで1つのことを行い、すべてのポップアップ値をnullに設定します。次に、デフォルトに設定されているすべての値をクリックします。
またはクリックすると、以前のすべての値をnullに設定します。その後、それぞれの値をすべて設定します。
私も同じ問題を抱えていました。 Primefacesを使用している場合、解決策は、選択したアイテムをロードするp:commandLinkまたはp:commandButtonにresetValues="true"
を配置するだけです。