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 调用链接到组件,但 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");
     }

如何在此处的每个选择 ele 上添加 ajax 调用?你更喜欢这两种方法中的哪一种?

这是一个非常简单的例子,我不首先通过循环构建很多选择 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 回答