0

我试图找到这个 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我想要呈现的元素(在这个简化的示例中)。

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

4

1 回答 1

1

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

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


也不如何让它轻松访问我想要呈现的 outputText 元素(在这个精简的例子中)

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

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

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

是的。只需在视图侧进行即可。您可以使用它<c:forEach>来动态创建<h:column>组件。或者,您可以抓取例如 PrimeFaces <p:columns>。另请参阅,例如,基于 hashmaps 列表动态生成 h:column

于 2013-02-01T11:59:27.333 回答