Mam prosty komponent złożony z opcjonalnym detektorem ajax zaimplementowanym z komponentem richfaces a4j: ajax.Komponent kompozytowy JSF2 - warunek atrybutu metody istnieje
Oto definicja interfejs:
<!-- INTERFACE -->
<composite:interface name="inplaceInput">
<composite:attribute name="value" required="true" />
<composite:attribute name="render" default="@this" />
<composite:attribute name="ajaxListener" method-signature="void actionListener(javax.faces.event.AjaxBehaviorEvent)" />
</composite:interface>
Poniższy kod działa poprawnie przy użyciu dwóch zduplikowane bloki z przeciwnej świadczonych Stan:
<composite:implementation>
<rich:inplaceInput value="#{cc.attrs.value}" rendered="#{!empty cc.attrs.ajaxListener}">
<a4j:ajax event="change" render="#{cc.attrs.render}" execute="@this" listener="#{cc.attrs.ajaxListener}" />
</rich:inplaceInput>
<rich:inplaceInput value="#{cc.attrs.value}" rendered="#{empty cc.attrs.ajaxListener}">
<a4j:ajax event="change" render="#{cc.attrs.render}" execute="@this" />
</rich:inplaceInput>
</composite:implementation>
ale chcę, aby uniknąć powielania, ponieważ mój składnik jak być znacznie bardziej skomplikowane ...
Korzystanie z renderowanym warunkiem na a4j: ajax był mój pierwszy pomysł:
<rich:inplaceInput value="#{cc.attrs.value}">
<a4j:ajax event="change" render="#{cc.attrs.render}" execute="@this" listener="#{cc.attrs.ajaxListener}" rendered="#{!empty cc.attrs.ajaxListener}" />
<a4j:ajax event="change" render="#{cc.attrs.render}" execute="@this" rendered="#{empty cc.attrs.ajaxListener}" />
</rich:inplaceInput>
Ale to nie działa, a błąd jest dość niejasne:
javax.faces.FacesException: Unable to resolve composite component from using page using EL expression '#{cc.attrs.ajaxListener}'
at com.sun.faces.facelets.tag.TagAttributeImpl$AttributeLookupMethodExpression.invoke(TagAttributeImpl.java:444)
at org.ajax4jsf.component.behavior.MethodExpressionAjaxBehaviorListener.processAjaxBehavior(MethodExpressionAjaxBehaviorListener.java:73)
Próbowałem z AC: jeśli handler dlatego, że drzewo nie musi mieć oba składniki:
<rich:inplaceInput value="#{cc.attrs.value}">
<c:if test="#{!empty cc.attrs.ajaxListener}">
<a4j:ajax event="change" render="#{cc.attrs.render}" execute="@this" listener="#{cc.attrs.ajaxListener}" />
</c:if>
<c:if test="#{empty cc.attrs.ajaxListener}">
<a4j:ajax event="change" render="#{cc.attrs.render}" execute="@this" />
</c:if>
</rich:inplaceInput>
A potem dostał inny błąd (przy użyciu ajaxListener = "# {itemList.updateValue}"):
javax.el.PropertyNotFoundException: /pages/itemList.xhtml @71,81 ajaxListener="#{itemList.updateValue}": Property 'updateValue' not found on type com...ItemListManager
Jeśli atrybutem był EL zwracający wartość, mógłbym przetestować wartość domyślną. Mogę również dodać atrybut boolean do określenia, czy słuchacz jest ustawiony ... Lub dodać domyślną metodę bean komponentu, nie robiąc nic ... Ale to nie jest piękne ...
Jak mogę sprawdzić, czy atrybut jest ustawić bez dostępu do jego wartości lub metody wiązania?
Dzięki z góry za wszelkie pomysł
Rgds,
FM
Czy są jakieś specjalne wymagania, aby z tego skorzystać? Po pierwsze, mój parser EL nie lubi(). Działa z [], ale wtedy pojawia się błąd podczas uzyskiwania dostępu do strony z napisem "UINaming Container nie ma właściwości getValueExpression". – Louise
Louise: Aby korzystać z tego kodu, musisz użyć wersji 2.2 programu EL-api. – Florian