1

当我做:

<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
4

1 回答 1

4

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

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

于 2013-03-25T12:40:29.980 回答