RichFaces Ajax(有条件的)渲染:HowTo?

时间:2011-04-12 13:57:52

标签: ajax jsf richfaces

请查看以下代码段:

<h:form>
    <h:panelGrid columns="2">
        <h:inputText value="#{vehicleBean.pin}" />
        <a4j:commandButton action="#{vehicleBean.loadVehiclesByPin}" render="results"/>
    </h:panelGrid>
</h:form>
<a4j:outputPanel id="results">
    <rich:dataTable value="#{vehicleBean.vehicles}" rendered="#{not empty vehicleBean.vehicles}">
        ...
    </rich:dataTable>
</a4j:outputPanel>

当我按下按钮时,会发送一个Ajax请求来加载一些业务实体。 它们显示在rich:dataTable中,只有在相应的数组不为空时才会呈现。

这适用于我的Chrome和Firefox 4,但不适用于IE9。 但我很确定这是我的错,而不是IE的; - )

所以请告诉我:

  • 解决此类问题的正确方法是什么(使用有条件渲染的元素)?
  • 我应该重新渲染哪些元素?
  • commandButton还有一个执行属性:何时以及为什么必须使用此属性?

问候Sebi

2 个答案:

答案 0 :(得分:0)

RichFaces 3.x不支持IE9,请参考这篇文章: http://community.jboss.org/thread/156720

您可以升级到RF 4, 或实现过滤器以强制IE9以兼容模式运行:

public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
    HttpServletResponse resp = (HttpServletResponse) response;
    resp.addHeader("X-UA-Compatible", "IE=EmulateIE8");
    chain.doFilter(request, resp);
}

答案 1 :(得分:0)

你可以解决的一些问题:

  1. 让您的表单标记包围所有JSF组件
  2. 如果loadVehiclesByPin依赖于pin的值,你应该使用commandButton执行inputText组件(为它分配一个id,例如“inputPin”):execute =“@ this inputPin
  3. 我不确定,如果你在render =“result”中使用了正确的内容(请注意NamespaceContainer概念,请阅读 UIComponent.findComponent 的javadoc)
  4. 为了更好的调试,我建议在web.xml中启用PROJECT_STAGE =开发并打开浏览器javascript控制台。

    请注意,在使用条件渲染时,您需要将渲染参数指向JSF组件树中的id(已经存在)(您通过将条件dataTable与面板包围在一起)

    问候