【问题标题】:encodeAll() not called on a composite component when rendered attribute is wrapped包装渲染属性时未在复合组件上调用 encodeAll()
【发布时间】:2013-03-14 20:53:25
【问题描述】:

当我这样做时:

<h:form>
    <ui:repeat ...>
        <ui:fragment rendered="#{xyz.type eq 1}"
           <h:inputText value="#{xyz}"/>
        </ui:frament>

        <ui:fragment rendered="#{xyz.type eq 2}"
           <my:component value="#{xyz}"/>
        </ui:frament>
    <ui:repeat />
</h:form>

encodeAll() 不会在 my:component 上被调用,因此现有值不会显示。

如果我执行以下操作

    <ui:repeat ...>
        <ui:fragment rendered="#{xyz.type eq 1}"
           <h:inputText value="#{xyz}"/>
        </ui:frament>

        <ui:fragment rendered="#{xyz.type eq 2}"
           <h:form>
               <my:component value="#{xyz}"/>
           </h:form>
        </ui:frament>
    <ui:repeat />

后一个例子当然没用,因为我想要动态输入。现有(默认)组件如 datepicker、inputtext、... 功能正常,只有我的组件不显示现有值(未调用 encodeAll)。

我还尝试了 h:datatable 组件而不是 ui:repeat(但不知道为什么),结果相同。

INFO: Initializing Mojarra 2.1.6 (SNAPSHOT 20111206) for context '/webclient'
INFO: Running on PrimeFaces 3.5
INFO: Running on PrimeFaces Extensions 0.6.3

【问题讨论】:

  • 是自定义组件(Java)还是复合组件(XHTML)?您的问题标题和问题标签相互矛盾。要了解区别,请阅读stackoverflow.com/questions/6822000/…
  • 这是一个自定义组件 balusc.blogspot.de/2013/01/… - 灵感来自您的代码
  • 这不完全是自定义组件,而是复合组件。
  • 我发布了一个答案,但在未来,请提供一个真正的 SSCCE,而不是过于简单的 sn-p,它在 copy'n'paste'n'runned 时根本不会重现问题进入一个空白的游乐场环境。

标签: java jsf jsf-2 composite-component


【解决方案1】:

我无法根据给定的代码重现您的问题,但是当我将它包装在 PrimeFaces 组件中时,我可以重现它。例如。当&lt;ui:fragment&gt;&lt;p:panel&gt; 替换时(没有rendered!)。这是由于 PrimeFaces CoreRenderer 没有在 renderChildren() 方法中调用 UIComponent#encodeAll(),而是分别调用 encodeBegin()encodeChildren()encodeEnd() 造成的。

如果您在encodeBegin() 而不是encodeAll() 中执行该工作,那么它应该可以工作。我已经相应地更新了我的复合组件文章。

【讨论】:

  • 谢谢 BalusC,你拯救了我的一天。
猜你喜欢
  • 1970-01-01
  • 2013-03-07
  • 2012-10-05
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
  • 2011-05-08
  • 2021-01-12
  • 1970-01-01
相关资源
最近更新 更多