当我这样做的时候:
<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()
中执行作业,那么它应该工作。我已经相应地更新了我的复合组件文章