2013-07-15 67 views
1

我正在尋找一種可能性編寫ajax調用每個元素。jsf以編程方式ajax函數調用

我有辦法,建立UI組件

第一 - 結合 - panelGroup中)

HtmlSelectOneMenu HSOM = new HtmlSelectOneMenu();  
    UISelectItems items = new UISelectItems(); 

    List<SelectItem> comboList = new ArrayList<SelectItem>();   
    comboList.add(new SelectItem(" ")); 
    comboList.add(new SelectItem("1")); 
    comboList.add(new SelectItem("2")); 
    comboList.add(new SelectItem("3")); 

    items.setValue(comboList); 
    HSOM.getChildren().add(items);      
    HSOM.setValueExpression("value", buildValueExpression("#{productDetails.productOptionValue}")); 

    AjaxBehavior ajax = new AjaxBehavior(); 
    ajax.setValueExpression("value", buildValueExpression("#{productDetails.updateProduct()}")); 
    HSOM.addClientBehavior("valueChange", ajax); 
    HSOM.addValidator(new BeanValidator()); 
    productOptions.getChildren().add(HSOM); 

    private ValueExpression buildValueExpression(String exp) { 
    FacesContext facesInstance = FacesContext.getCurrentInstance(); 
    Application application = facesInstance.getApplication(); 
    ExpressionFactory expressionFactory = application.getExpressionFactory(); 
    String expression = exp; 
    return expressionFactory.createValueExpression(facesInstance.getELContext(), expression, String.class); 
} 

我所看到的,一個AJAX調用鏈接到組件,但的UpdateProduct()函數沒有被調用。

的另一種可能創建動態組件是)

public void encodeEnd(FacesContext context) throws IOException { 
      System.out.println("Start encoding");  
    ResponseWriter responseWriter = context.getResponseWriter(); 
    responseWriter.startElement("span", null); 
    responseWriter.writeAttribute("id",getClientId(context),"id"); 
    responseWriter.writeAttribute("name", getClientId(context),"clientId"); 
    responseWriter.write("Farbe"); 
    responseWriter.endElement("span"); 

    responseWriter.startElement("select", null); 
    responseWriter.writeAttribute("id",getClientId(context),"id"); 
    responseWriter.writeAttribute("name", getClientId(context),"clientId"); 
    responseWriter.writeAttribute("value", "#{artikelDetails.productOptionValue}", "value"); 
     responseWriter.startElement("option", null); 
     responseWriter.write("Gelb"); 
     responseWriter.endElement("option");  
     responseWriter.startElement("option", null); 
     responseWriter.write("Blau"); 
     responseWriter.endElement("option"); 
    responseWriter.endElement("select");   
    System.out.println("End encoding"); 
    } 

如何添加AJAX調用上的每個選擇ELE這裏? 你更喜歡哪種方法?

這是一個非常簡單的例子,在這裏我不通過環 建立很多選擇ELE首先我需要得到這個工作...

回答

0

你需要給所有的程序創建的輸入和命令組件固定ID,以便JSF可以在請求參數映射中找到所需的提交信息。否則,他們最終會得到一個自動生成的ID,這在回發期間是不同的。

在你的情況,這是這樣的:

HSOM.setId("someId"); 

而你更喜歡哪兩種方法的呢?

兩者都不是。我相信Java是在視圖中聲明組件的目的的錯誤工具。 JSF已經與Facelets一起發佈了允許用XML方法以更簡單更清晰的方式聲明組件的框。如果您打算基於某些先決條件動態構建視圖,請查看JSTL。另見其他How to make a grid of JSF composite component?JSTL in JSF2 Facelets... makes sense?

+0

感謝balus,我會試試看。 – Sence

+0

但是,如果有很多組件需要構建,基於數據庫信息(例如產品變體和條件),我喜歡以編程方式構建em。 當然,我可以使用ui:repeat,jstl和其他ui「management」組件,但我不同意使用ui組件總是更乾淨更好。 如果你有一棵樹有很多葉子,你可以定義一個連接函數,並且如果一個葉子有更多的子元素,就自動執行這個函數。 jstl或ui如何做:重複? vg – Sence

+0

JSTL不會在組件樹中結束。它在構建組件樹期間運行。請注意'ui:repeat'不是JSTL,'c:forEach'(和'c:if'等)是。點擊給定的鏈接以獲取更多信息。 – BalusC