当渲染属性被包装时,不会在复合组件上调用encodeAll()



当我这样做的时候:

<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、…函数ok,它只是我的组件,不显示现有的值(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

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

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

相关内容

  • 没有找到相关文章

最新更新