我试图找到这个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
元素(在这个缩减示例中)。
此外,这似乎出乎意料地复杂:这一切都源于对具有未知列数的表的需求。 我是否可能只是通过在代码中创建整个表从根本错误的角度来解决这个问题?
但是我不知道如何让 Ajax 调用来执行我的句柄切换方法
您的代码对某些特定于环境的怪癖很敏感。较旧的 Mojarra 实现无法执行以编程方式创建的 ajax 行为侦听器方法。确保您使用的是最新版本,或尝试使用MyFaces。某些特定于容器的 EL 实现无法调用匿名类上的方法。确保使用的是最新的容器版本,或将其提取到公共类中。
也不知道如何让它轻松访问我要渲染的 outputText 元素(在此缩减示例中)
使用AjaxBehavior#setRender()
方法设置 render
属性。
ajaxBehavior.setRender(Collections.singletonList("outputText"));
此外,这似乎出乎意料地复杂:这一切都源于对具有未知列数的表的需求。我是否可能只是通过在代码中创建整个表从根本错误的角度来解决这个问题?
是的。只需在视图方面进行即可。您可以使用<c:forEach>
动态创建<h:column>
组件。或者,您可以抓取例如 PrimeFaces <p:columns>
.另请参阅例如,基于哈希图列表动态生成h:column。