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

时间:2013-03-25 11:24:47

标签: java jsf jsf-2 composite-component

当我这样做时:

<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

1 个答案:

答案 0 :(得分:4)

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

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