apo*_*pod 1 java jsf composite-component jsf-2
当我做:
<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>
Run Code Online (Sandbox Code Playgroud)
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 />
Run Code Online (Sandbox Code Playgroud)
后一个例子当然是无用的,因为我想要动态输入。现有(默认)组件如 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
Run Code Online (Sandbox Code Playgroud)
我无法根据给定的代码重现您的问题,但当我将其包装在 PrimeFaces 组件中时,我可以重现它。例如,何时<ui:fragment>被替换为<p:panel>(不带rendered!)。这是由于 PrimeFaces不是在方法中CoreRenderer调用,而是单独调用和造成的。UIComponent#encodeAll()renderChildren()encodeBegin()encodeChildren()encodeEnd()
encodeBegin()如果您在而不是执行该工作encodeAll(),那么它应该可以工作。我相应地更新了我的复合组件文章。