2014-03-01 71 views
0

我想創建一個頁面以允許用戶更新mysql表。這個表格可以由客戶端管理員改變,所以我必須讀取表格模式並隨時創建字段。我從How to create dynamic JSF form fieldsHow 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。前者是可取的,因爲我想禁用保存按鈕,直到有些事情發生了變化,但我願意接受後者。任何幫助將非常感激。

+0

我不認爲這個答案適用於你。 AjaxBehavior是一個JSF2構造,我不相信這是在v1.x中支持的 – kolossus

+0

表單的創建工作在2.0以下。 (我正在運行2.2)(這是這個工作的一部分。)問題是每次字段發生變化時如何獲得ajax調用。我在p:editor中的valueChangeListener遇到了類似的問題,但它沒有解決問題,而且還有一個解決方法,它可能也適用於此。但客戶行爲監聽者似乎是正確的,我真的很想知道我的錯在哪裏如何工作。 – wjr

回答

0

原來這段代碼確實有效。在我蜿蜒的某個地方,錯誤發生了變化,我不明白這一點的重要性。使用h:head替換頭部,在添加字段的xhtml文件中使ajax工作。

相關問題