如何将f:ajax标签的等价物添加到动态生成的复选框中?

时间:2013-02-01 07:32:17

标签: java ajax jsf

我正在尝试找到这个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元素(在此剪切中) - 示例)。

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

1 个答案:

答案 0 :(得分:1)

  

但我无法弄清楚如何让Ajax调用来执行我的handleToggle方法

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


  

也不是如何让它轻松访问我想要呈现的outputText元素(在此缩减示例中)

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

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

  

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

是。只是在视图方面做。您可以使用<c:forEach>动态创建<h:column>个组件。或者,你可以抓住,例如PrimeFaces <p:columns>。另见例如Dynamically generate h:column based on list of hashmaps