Comment reconnaître Java Server Faces 2.0 composants composites lors de l'utilisation ajax?
-
26-09-2019 - |
Question
J'ai Java Server suivante Faces 2.0 composant composite. Remarquez que je suis en utilisant verbatim
resources/customer/customer.xhtml
<composite:interface>
<composite:attribute name="id" required="false"/>
<composite:attribute name="firstName" required="false"/>
<composite:attribute name="lastName" required="false"/>
<composite:attribute name="age" required="false"/>
<composite:attribute name="rendered" required="false"/>
</composite:interface>
<composite:implementation>
<f:verbatim id="#{cc.attrs.id}" rendered="#{cc.attrs.rendered}">
<div>
<div>
<p>First name</p>
<h:outputText value="#{cc.attrs.firstName}"/>
</div>
<div>
<p>Last name</p>
<h:outputText value="#{cc.attrs.lastName}"/>
</div>
<div>
<p>Age</p>
<h:outputText value="#{cc.attrs.age}"/>
</div>
</div>
</f:verbatim>
</composite:implementation>
Pour utiliser ajax, je l'ai fait (avis render attribut)
<h:form id="search">
<div>
<h:commandButton value="Search" action="#{customerSearchController.search}">
<f:ajax execute="@form" render="search:result"/>
</h:commandButton>
</div>
<customer:customer id="result"
rendered="#{customerSearchController.customer != null}"
firstName="#{customerSearchController.customer.firstName}"
lastName="#{customerSearchController.customer.lastName}"
age="#{customerSearchController.customer.age}"/>
</h:form>
Mon CustomerSearchController est présenté comme suit
private Customer customer;
// getter's and setter's
public void search() {
customer = new Customer();
customer.setFirstName("First");
customer.setLastName("Last");
customer.setAge(30);
}
Les deux CustomerSearchController et le client sont gérés haricots. Mais quand je l'appelle ajax demande, il se plaint: recherche: Résultat non trouvé
Que devrait faire i pour résoudre ce problème ???
La solution
<f:ajax render>
doit pointer vers un ID client existant dans l'arborescence DOM HTML. Cependant, comme élément de search:result
n'est pas disponible dans l'arborescence DOM HTML, car ce n'est pas rendu par le côté serveur, JS / ajax ne trouve rien dans l'arbre DOM HTML pour la mise à jour / rendu.
l'envelopper dans un autre élément qui est toujours disponible dans l'arborescence DOM HTML afin que l'Ajax peut le localiser.
<h:panelGroup id="result">
<customer:customer rendered="..." />
</h:panelGroup>
Rien à voir avec le problème réel, notez que f:verbatim
est censé ne contenir que textuellement (HTML brut), pas des composants JSF. Remplacez-le par h:panelGroup
.