#jsf #composite-component #omnifaces
#jsf #составной компонент #omnifaces
Вопрос:
Я хотел бы включить ниже составной компонент программно:
<composite:interface>
<composite:attribute name="sampleBean" />
<composite:attribute name="autoCompleteMethod"
method-signature="java.util.List autoCompleteMethod(java.lang.String)" />
</composite:interface>
В Omnifaces есть функция:
// Programmatically include composite component.
Components.includeCompositeComponent(someParentComponent, libraryName, resourceName, id);
Однако мне непонятно, как указать autoCompleteMethod
в полученном экземпляре UIComponent. Как я могу этого добиться?
Ответ №1:
includeCompositeComponent()
Возвращает UIComponent
экземпляр, представляющий составную реализацию.
UIComponent composite = Components.includeCompositeComponent(someParentComponent, libraryName, resourceName, id);
Все его атрибуты доступны как Map
by UIComponent#getAttributes()
.
Map<String, Object> attributes = composite.getAttributes();
Вы можете использовать Components#createMethodExpression()
для создания выражения метода EL. Предполагая, что вы собираетесь указать #{bean.complete}
, вот пример:
MethodExpression autoCompleteMethod = Components.createMethodExpression("#{bean.complete}", List.class, String.class);
Теперь просто установите его как атрибут!
attributes.put("autoCompleteMethod", autoCompleteMethod);