【问题标题】:jsf programmatically ajax function calljsf 以编程方式调用 ajax 函数
【发布时间】:2013-07-15 15:22:56
【问题描述】:

我正在寻找在每个元素上以编程方式编写 ajax 调用的可能性。

我有办法构建 UI 组件

first - 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");
     }

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

这是一个非常简单的例子,我没有通过循环构建很多选择 ele 首先我需要完成这项工作......

【问题讨论】:

    标签: ajax jsf-2


    【解决方案1】:

    您需要为所有以编程方式创建的输入和命令组件提供一个固定 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?

    【讨论】:

    • 但是如果有很多组件要构建,基于数据库信息,例如产品变化和条件,我喜欢以编程方式构建它们。当然我可以使用 ui:repeat、jstl 和其他 ui“管理”组件,但我不同意使用 ui 组件总是更干净更好。如果你有一棵有很多叶子的树,你可以定义一个连接函数并在叶子有更多子元素时自动执行该函数。如何使用 jstl 或 ui:repeat ? vg
    • JSTL 不会出现在组件树中。它在构建组件树期间运行。请注意,ui:repeat 不是 JSTL,c:forEach(和 c:if 等)是。单击给定的链接以获取启发。
    猜你喜欢
    • 2018-05-15
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多