У меня есть составной компонент JSF 2, который использует некоторое поведение Ajax. Я хочу добавить метод listener
в тег
внутри моего составного компонента, но метод listener
должен быть предоставлен как <композитный: атрибут>
в <композитный: интерфейс>
.
Тег
внутри моего составного компонента в настоящее время жестко закодирован для прослушивателя вот так:
<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>
И метод в моем вспомогательном компоненте
public void updatedEventListenerXYZ() {
// do something here...
}