【问题标题】:How to add the equivalent of f:ajax tag to a dynamically generated checkbox?如何将等效的 f:ajax 标记添加到动态生成的复选框?
【发布时间】:2013-01-16 11:46:07
【问题描述】:

我正在尝试找到与此 XHTML 代码等效的代码:

<h:selectBooleanCheckbox value="#{sandboxBean.selected}" >
  <f:ajax listener="#{sandboxBean.handleToggle}" render="outputText" />
</h:selectBooleanCheckbox>

<br /><br />
<h:outputText value="#{sandboxBean.selected}" id="outputText"/>

对于整个复选框必须由支持 bean 动态创建的情况。我已经设法通过这段代码获得了一些 Ajax 优点:

checkbox = new HtmlSelectBooleanCheckbox();
checkbox.setId(makeCheckboxId());

AjaxBehavior valueChangeAction = (AjaxBehavior)FacesContext.getCurrentInstance().getApplication().createBehavior(AjaxBehavior.BEHAVIOR_ID);

valueChangeAction.addAjaxBehaviorListener(new AjaxBehaviorListener() {

  @Override
  public void processAjaxBehavior(AjaxBehaviorEvent event) throws AbortProcessingException {
    System.out.println("Ajax behavior called");     
  }
});

checkbox.addClientBehavior("valueChange", valueChangeAction);

但我不知道如何让 Ajax 调用来执行我的 handleToggle 方法,也不知道如何让它轻松访问我想要呈现的 outputText 元素(在这个精简的示例中) .

此外,这似乎出乎意料地复杂:这一切都源于对具有未知列数的表的需求。我是否可能只是通过在代码中创建整个表格从根本上错误的角度来解决这个问题?

【问题讨论】:

    标签: java ajax jsf


    【解决方案1】:

    但我不知道如何让 Ajax 调用来执行我的 handleToggle 方法

    您的代码对某些特定于环境的怪癖很敏感。较旧的 Mojarra 实现无法执行以编程方式创建的 ajax 行为侦听器方法。确保您拥有最新版本,或尝试 MyFaces。某些特定于容器的 EL 实现无法调用匿名类的方法。确保您使用的是最新的容器版本,或将其提取到公共类中。


    也不知道如何让它轻松访问我想要渲染的 outputText 元素(在这个精简的示例中)

    使用AjaxBehavior#setRender()方法设置render属性。

    ajaxBehavior.setRender(Collections.singletonList("outputText"));
    

    此外,这似乎出乎意料地复杂:这一切都源于对具有未知列数的表的需求。我是否可能只是通过在代码中创建整个表格从根本上错误的角度来解决这个问题?

    是的。只需在视图侧进行即可。您可以使用&lt;c:forEach&gt; 动态创建&lt;h:column&gt; 组件。或者,你可以抓住例如PrimeFaces&lt;p:columns&gt;。另见例如Dynamically generate h:column based on list of hashmaps.

    【讨论】:

    • 谢谢。我会试试 PrimeFaces,并升级到更新的实现。我曾尝试过&lt;c:forEach&gt;,但令人困惑的是,完整的标签被渲染到 HTML 中,而不是实际执行广告的操作。
    • 也许您只是忘记或打错了 JSTL 核心 taglib XML 命名空间?然后标签确实会未被解析并在呈现的 HTML 中显示为普通的香草。正确的 JSTL 核心 taglib XML 命名空间是 xmlns:c="http://java.sun.com/jsp/jstl/core"
    • 我会发誓我已经三重检查了,但我又试了一次, 现在正在工作。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多