Ответ 1
Этот состав не правильно разработан. Вы не должны использовать #{cc.clientId}
вне составного контекста. В более общем плане вы не должны ничего знать о составных внутренних компонентах вне композита. Сам состав должен беспокоиться об этом.
Эта конструкция завершится неудачей, если вы вставляете составные компоненты друг в друга. #{cc}
тогда фактически ссылается на "текущий" составной компонент. Возможно, вы полагались на ошибку в более старой реализации JSF, где область #{cc}
не удаляется должным образом после вложенного составного компонента (т.е. она будет ссылаться на последнее назначенное значение вместо значения, доступного в текущем контексте).
Возможно, вы являетесь жертвой злоупотребления составными компонентами только для неправильного использования и только из-за нулевой конфигурации по сравнению с обычными файлами tagfiles/includes. Для подробностей относительно того, когда именно использовать тот или иной, перейдите в Когда использовать < ui: include > , файлы тегов, составные компоненты и/или настраиваемые компоненты? По существу, используйте только композит и только если вы хотите привязать связку тесно связанных компонентов к свойству single bean и, следовательно, конечно, не к "целому" bean с несколькими свойства.
Если вы абсолютно уверены, что композит является правильным решением для вашего требования и/или вы реорганизовали композит, чтобы устранить упомянутое злоупотребление, тогда есть два возможных подхода для применения поведения клиента в составном компоненте, в зависимости от конкретного функционального требования (при необходимости вы можете комбинировать оба пути).
-
Если вы хотите, чтобы композитный ajax-визуализировал компонент вне составной, внесите
<p:ajax>
(или<f:ajax>
) как<cc:clientBehavior>
:<cc:interface> <cc:clientBehavior name="myCustomEventName" targets="idOfTargetComponent" event="valueChange" /> ... </cc:interface> <cc:implementation> <h:selectOneMenu id="idOfTargetComponent" ...> <f:selectItems ... /> </h:selectOneMenu> </cc:implementation>
который должен использоваться как:
<t:enum ...> <p:ajax event="myCustomEventName" update=":absoluteClientIdOfComponentOUTSIDEComposite" /> </t:enum> <x:someComponent id="idOfComponentOUTSIDEComposite" />
-
Если вы хотите, чтобы композитный ajax-визуализировал компонент внутри составной, тогда пусть композит сделает все сам по себе.
<cc:interface> ... </cc:interface> <cc:implementation> <h:selectOneMenu ...> <f:selectItems ... /> <p:ajax update="idOfComponentINSIDEComposite" /> </h:selectOneMenu> <x:someComponent id="idOfComponentINSIDEComposite" /> </cc:implementation>
И используйте его обычным способом:
<t:enum ... />