2013-03-25 1 views
1

Когда я: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() doesen't вызывается на 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, ... function ok, только мой компонент не показывает существующие значения (encodeAll not called).

Я также пробовал h: datatable component вместо 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 
+0

Является ли это настраиваемым компонентом (Java) или составным компонентом (XHTML)? Заголовок вопроса и теги вопросов противоречат друг другу. Чтобы узнать разницу, прочитайте http://stackoverflow.com/questions/6822000/when-to-use-uiinclude-tag-files-composite-components-and-or-custom-componen/6822269#6822269 – BalusC

+0

Это обычай компонент http://balusc.blogspot.de/2013/01/composite-component-with-multiple-input.html - вдохновленный вашим кодом – apod

+0

Это не особый компонент, это составной компонент. – BalusC

ответ

4

Я не могу воспроизвести проблему на основе данного кода, но я могу воспроизвести его, когда я оберните его в компоненте PrimeFaces. Например. когда <ui:fragment> заменяется на <p:panel> (без rendered!). Это вызвано тем, что PrimeFaces CoreRenderer не звонил UIComponent#encodeAll() в renderChildren(), но encodeBegin(), encodeChildren() и encodeEnd() отдельно.

Если вы выполняете работу в encodeBegin() вместо encodeAll(), тогда это должно сработать. Я соответствующим образом обновил статью составного компонента.

+0

Спасибо, BalusC, вы только что спасли мой день. – apod

+0

Добро пожаловать. – BalusC