2011-08-23 11 views
6

Mam składnik kompozytu z interfejsem, który zawiera to:W jaki sposób komponent złożony ustawia właściwość w komponencie bean klienta?

<cc:attribute name="model" 
        shortDescription="Bean that contains Location" > 
     <cc:attribute name="location" type="pkg.Location" 
         required="true" /> 
    </cc:attribute> 
</cc:interface> 

Więc mogę otworzyć Lokalizacja obiekt w znacznikach z # {cc.attrs.model.location}.

ja również dostęp do tego obiektu z fasoli podkładowej składnika złożonego jak ten:

FacesContext fc = FacesContext.getCurrentInstance(); 
    Object obj = fc.getApplication().evaluateExpressionGet(fc, 
      "#{cc.attrs.model.location}", Location.class); 

Więc teraz moja zespolonej wykonała swoją pracę - jak zgłoszę metody setter na modelu z backing bean? (Tj model.setLocation (someValue)?

Odpowiedz

6

Zastosowanie ValueExpression#setValue().

FacesContext facesContext = FacesContext.getCurrentInstance(); 
ELContext elContext = facesContext.getELContext(); 
ValueExpression valueExpression = facesContext.getApplication().getExpressionFactory() 
    .createValueExpression(elContext, "#{cc.attrs.model.location}", Location.class); 

valueExpression.setValue(elContext, newLocation); 

Application#evaluateExpressionGet() przy okazji zwraca ValueExpression#getValue() pod kołdrą, dokładnie tak, jak opisane przez jego javadoc (jeśli kiedykolwiek ją przeczytać. ..)


niezwiązane do konkretnego problemu, jesteś świadomy o możliwości utworzyć klasę podkładu UIComponent dla komponentu kompozytowego? Założę się, że jest to o wiele łatwiejsze niż manipulowanie w ten sposób przy pomocy ValueExpression. Następnie można użyć odziedziczonej metody getAttributes(), aby uzyskać model.

Model model = (Model) getAttributes().get("model); 
// ... 

Możesz znaleźć przykład w naszym composite component wiki page.

+0

Mówisz o użyciu adnotację @FacesComponent, prawda? Opublikowalem kolejne pytanie na ten temat za pomoca tagu Component-Component i wydaje mi sie, ze to odpowiada na to pytanie. – AlanObject

+0

Tak, zgadza się. Zobacz także połączone wiki. Nie widziałem twojego drugiego pytania. Zwróć uwagę na prawidłowe oznaczanie. Ludzie tutaj zwykle przeglądają (ciekawe) tagi. – BalusC

1

co z atrybutem "domyślny"? To szew, że nie jest zaimplementowane podczas korzystania z implementacji komponentu backing.

xhtml:

<composite:interface> 
    <composite:attribute name="test" 
         type="java.lang.Boolean" 
         default="#{false}"/> 
</composite:interface> 
<composite:implementation > 
    TEST : #{cc.attrs.test} 
</composite:implementation > 

Java realizacja podkład:

testValue = (Boolean) getAttributes().get("test"); 

jeżeli atrybut Test jest ustawiony w głównej xhtml żadnego problemu: zarówno xhtml i java podkład mają taką samą wartość. Ale gdy nie jest ustawiona wartość domyślna to tylko na xhtml: HTML zawiera

TEST : false 

ale testValue jest nieważna w podkładzie

Powiązane problemy