我想創建一個頁面以允許用戶更新mysql表。這個表格可以由客戶端管理員改變,所以我必須讀取表格模式並隨時創建字段。我從How to create dynamic JSF form fields和How to add ajax validation to programmatically generated primefaces component的ajax代碼得到了基本代碼。如何將ajax添加到動態創建的primefaces輸入字段
要創建概念頁的證明,我用下面的代碼(注意,我使用primefaces):
for (int idx = 1; idx < 3; idx++) {
UIInput input = new InputText();
input.setId("text" + idx);
ValueExpression targetExpression = facesContext.getApplication().getExpressionFactory().createValueExpression(facesContext.getELContext(), "#{viewMakeFields.value}", String.class);
input.setValueExpression("value", targetExpression);
AjaxBehavior ab = new AjaxBehavior();
ab.setAsync(true);
ab.setProcess("text"+idx);
input.addClientBehavior("blur", ab); // "change" doesn't work either
form.getChildren().add(input);
}
然後,在getter和setter,我得到的分量ID來標識該場被改變:
public static String getCallingComponentID() {
UIComponent component = UIComponent.getCurrentComponent(FacesContext.getCurrentInstance());
return component.getId();
}
public String getValue() {
String id = getCallingComponentID();
System.out.println("getValue " + id);
return text1;
}
public void setValue(String text1) {
String id = getCallingComponentID();
System.out.println("setValue " + id);
this.text1 = text1;
}
阿賈克斯在不觸發,當我點擊提交按鈕,我得到(我知道混合部分和全部的提交不好):
INFO: getValue text1
INFO: getValue text2
INFO: getValue text1
INFO: getValue text2
INFO: setValue j_id1
INFO: setValue j_id1
INFO: getValue text1
INFO: getValue text2
我看到兩種可能的解決方案:讓Ajax工作,以便調用setter的組件具有正確的id或獲取表單提交以標識哪個孩子正在調用setter。前者是可取的,因爲我想禁用保存按鈕,直到有些事情發生了變化,但我願意接受後者。任何幫助將非常感激。
我不認爲這個答案適用於你。 AjaxBehavior是一個JSF2構造,我不相信這是在v1.x中支持的 – kolossus
表單的創建工作在2.0以下。 (我正在運行2.2)(這是這個工作的一部分。)問題是每次字段發生變化時如何獲得ajax調用。我在p:editor中的valueChangeListener遇到了類似的問題,但它沒有解決問題,而且還有一個解決方法,它可能也適用於此。但客戶行爲監聽者似乎是正確的,我真的很想知道我的錯在哪裏如何工作。 – wjr