1

すべての要素に対してプログラムで 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 Call がコンポーネントにリンクされていることがわかりますが、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 呼び出しを追加する方法は? そして、両方の方法のどちらを好みますか?

これは非常に単純な例です。最初にループを介して多くの select ele を構築しない場合、この作業を行う必要があります...

4

1 に答える 1

0

プログラムで作成されたすべての入力コンポーネントとコマンド コンポーネントに固定 ID を付与する必要があります。これにより、JSF はリクエスト パラメータ マップで送信された必要な情報を見つけることができます。そうしないと、ポストバック中に異なる自動生成された ID を取得することになります。

あなたの場合、それはこうです:

HSOM.setId("someId");

そして、両方の方法のどちらを好みますか?

どちらでもない。ビューでコンポーネントを宣言する目的で Java は不適切なツールであると確信しています。JSF にはすでに Facelets が付属しており、XML を使用してコンポーネントをより簡単かつクリーンな方法で宣言できます。いくつかの前提条件に基づいてビューを動的に構築する場合は、JSTL を参照してください。とりわけ、JSF 複合コンポーネントのグリッドを作成する方法を参照してください。JSF2 FaceletsのJSTL...理にかなっていますか?

于 2013-07-15T16:38:38.053 に答える