2016-08-12 5 views
2

У меня есть составной компонент, который в основном состоит из компонента selectManyCheckbox. Как следует проектировать в общем виде я прохожу в selectItems, Аякс обработки и т.д. от уровня вызова с использованиемКак ссылаться на компонент внутри составного компонента при использовании преобразователя

<composite:insertChildren/> 

Это работает очень хорошо для большинства вещей. Теперь мне нужно использовать этот составной компонент с конвертером. Поскольку конвертер (тип Omnifaces ListConverter) не требуется все время (иногда я хочу иметь привязку значений к конкретным объектам, которые возвращают выбранные элементы, иногда я этого не делаю), я хотел бы передать это в качестве частей, упомянутых ранее (например, selectItems, обработка событий ajax).

Учитывая это, необходимо использовать атрибут «для» тега конвертера для ссылки на компонент внутри составного компонента. По крайней мере, это то, что я понимаю.

К сожалению, я не знаю, какое значение следует использовать. Должен ли я включать имя составного компонента (контейнер именования)? Должен ли я использовать clientId? Я попробовал много комбинаций, но конвертер не был вызван. Как только я помещаю тег конвертера внутри определения составного компонента, он работает.

Чтобы сделать вещи проще, давайте предположим, что у меня есть следующие:

<composite:interface> 
    <composite:attribute name="value" required="true"/> 
</composite:interface> 

<composite:implementation> 
    [...] 
    <h:selectManyCheckbox id="#{cc.attrs.id}" value="#{cc.attrs.value}"> 
     <composite:insertChildren/> 
    </h:selectManyCheckbox> 
    [...] 
</composite:implementation> 

Этот компонент следует использовать следующим образом:

<my:selectManyCheckbox id="myComponent" value="..."> 
    <f:selectItems value="..."/> 
    <o:converter for="___" converterId="..."/> 
</my:selectManyCheckbox> 

Возможно, кто-то может дать мне подсказку, какое значение должно быть дано к атрибуту 'for'.

ответ

2

Я сам нашел ответ. Вы можете использовать следующие

<composite:interface> 
    <composite:attribute name="value" required="true"/> 
    <composite:editableValueHolder name="input_component"> 
</composite:interface> 

<composite:implementation> 
    [...] 
    <h:selectManyCheckbox id="input_component" value="#{cc.attrs.value}"> 
     <composite:insertChildren/> 
    </h:selectManyCheckbox> 
    [...] 
</composite:implementation> 

Важной частью является editableValueHolder тег. Со страницы, использующей этот составной компонент, вы можете использовать

<o:converter for="input_component" converterId="id_of_converter" /> 

Это решение, которое работает на меня. Надеюсь, это поможет другим, имеющим ту же проблему.

 Смежные вопросы

  • Нет связанных вопросов^_^