本文介绍了动态的"for" p:tooltip的属性无法按预期工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图将optips附加到ui:repeat循环中的commandButtons.我也动态创建commandButtons的ID,也创建工具提示的"for"属性.这给出了以下错误:

I am trying to attach tooptips to commandButtons in a ui:repeat loop. I create ids of commandButtons dynamically and "for" properties of tooltips too. This gives following error:

    HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Cannot find component "a_test" in view.
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:325)
    org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
root cause

javax.faces.FacesException: Cannot find component "a_test" in view.
    org.primefaces.component.tooltip.TooltipRenderer.getTarget(TooltipRenderer.java:93)
    org.primefaces.component.tooltip.TooltipRenderer.encodeScript(TooltipRenderer.java:66)
    org.primefaces.component.tooltip.TooltipRenderer.encodeEnd(TooltipRenderer.java:35)
    javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:883)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1659)
    com.sun.faces.facelets.component.RepeatRenderer.encodeChildren(RepeatRenderer.java:104)
    com.sun.faces.facelets.component.UIRepeat.process(UIRepeat.java:504)
    com.sun.faces.facelets.component.UIRepeat.encodeChildren(UIRepeat.java:958)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1652)
    javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
    javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:853)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1652)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1655)
    com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:399)
    com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:313)
    org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.12 logs.

Apache Tomcat/7.0.12

我的jsf如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets">

<h:head></h:head>
<h:form id="MyForm">
    <ui:repeat var="rs"
        value="#{rezervasyonBean.rezervasyonSaatleriListesi}">
        <p:commandButton action="#" value="#{rs.saatAraligi}"
            update="@form"
            id="#{rs.saatAraligi}_test"
        />

        <p:tooltip for="#{rs.saatAraligi}_test" value="test text"/>
    </ui:repeat>

</h:form>
</html>

rezervasyonBean.rezervasyonSaatleriListesi是列表,而rs.saatAraligi的元素是a,b,c.

rezervasyonBean.rezervasyonSaatleriListesi is as list and elements of the rs.saatAraligi are a,b,c.

我的问题是:如何以相同的方式动态识别ui组件和p:tooltip的"for"属性?

My question is: how can I identify ui components dynamically and "for" attribute of p:tooltip in the same way?

致谢.

推荐答案

在视图构建期间评估JSF UI组件的ID属性,但是<ui:repeat>在视图呈现期间运行,因此#{rs.saatAraligi}将评估为null,因此命令按钮的ID始终为_test.

The ID attribute of JSF UI components is evaluated during view build time, however the <ui:repeat> runs during view render time and thus #{rs.saatAraligi} would evaluate to null and hence the ID of the command button would always be _test.

只需从idfor中删除#{rs.saatAraligi}表达式.您在这里不需要它. JSF将自动为<ui:repeat>的迭代索引添加前缀,从而确保ID的唯一性.

Just remove the #{rs.saatAraligi} expression from the id and for. You don't need it here. JSF will automatically prefix the iteration index of <ui:repeat> and thus ensure uniqueness of the ID.

<p:commandButton action="#" value="#{rs.saatAraligi}"
    update="@form"
    id="test"
/>
<p:tooltip for="test" value="test text"/>

另请参见:

  • JSF2 Facelets中的JSTL ...有意义吗?-一样故事适用于JSF UI组件的id属性
  • See also:

    • JSTL in JSF2 Facelets... makes sense? - the same story applies to id attribute of JSF UI components
    • 这篇关于动态的"for" p:tooltip的属性无法按预期工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-02 07:56