У меня есть составной компонент JSF 2, который использует некоторое поведение Ajax. Я хочу добавить метод listener
к тегу <f:ajax>
внутри моего составного компонента, но метод listener
должен быть указан как <composite:attribute>
в <composite:interface>
.
Тег <f:ajax>
внутри моего составного компонента в настоящее время жестко закодирован для слушателя следующим образом:
<f:ajax
event="valueChange"
execute="@this"
listener="#{controller.genericAjaxEventLogger}"
render="#{cc.attrs.ajaxRenderTargets}" />
Метод слушателя на bean имеет эту подпись:
public void genericAjaxEventLogger(AjaxBehaviorEvent event)
throws AbortProcessingException {
// implementation code...
}
Я хочу, чтобы составной компонент был примерно таким, чтобы страница могла предоставить свой собственный метод событий, но я не могу понять правильный синтаксис интерфейса.
<f:ajax
event="valueChange"
execute="@this"
listener="#{cc.attrs.ajaxEventListener}"
render="#{cc.attrs.ajaxRenderTargets}" />
Как я могу это сделать?
ОБНОВЛЕНО РЕШЕНИЕ:
Я взял подход, предложенный BalusC, и он отлично работает. Соответствующие фрагменты:
Объявление интерфейса в составном компоненте
<composite:interface>
<composite:attribute
name="myattributeUpdatedEventListener"
method-signature="void listener()"
required="true" />
...
</composite:interface>
Тег Ajax, используемый в моем составном компоненте
<f:ajax
event="valueChange"
execute="@this"
listener="#{cc.attrs.myattributeUpdatedEventListener}"
render="#{cc.attrs.ajaxRenderTargets}" />
Место на моей странице, где я использую составной компонент
<h:form>
<compcomp:myCompositeComponent
myattributeUpdatedEventListener="#{myBackingBean.updatedEventListenerXYZ}" />
</h:form>
И метод моей поддержки bean
public void updatedEventListenerXYZ() {
// do something here...
}