Witam, mam mały problem z ajaxem w primefaces. Chodzi o to, że jeśli próbuję (podkreślam próbuję) wywołać pewną metodę z beana w <p:commandButton> to on wywołuje ajax(tę metodę) zależnie od tego gdzie tego <p:commandButton> umieszcze. Jeżeli jest on dosyć na zewnątrz wszystkich znaczników to działa idealnie, a jeżeli go zagniezdze w przeroznych znacznikach to juz ajax nie wywołuje mojej metody z beana.
Kod Beana:
@RequestScoped
@ManagedBean(name = "project")
public class ProjectBean {
private List<Project> criteriaList;
public ProjectBean() {
System.out.println("ProjectBean Constructor()");
}
public List<Project> getCriteriaList() {
return criteriaList;
}
public void setCriteriaList(List<Project> criteriaList) {
this.criteriaList = criteriaList;
}
public void addSomething(ActionEvent actionEvent) {
criteriaList = new ArrayList<Project>();
Project p1 = new Project("test1", "opis1");
Project p2 = new Project("test2", "opis2");
Project p3 = new Project("test3", "opis3");
Project p4 = new Project("test4", "opis4");
criteriaList.add(p1);
criteriaList.add(p2);
criteriaList.add(p3);
criteriaList.add(p4);
System.out.println("ADD SOMETHING()");
}
}
I kod z PrimeFaces:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:p="http://primefaces.org/ui">
<ui:composition template="/templates/defaultTemplate/template.xhtml">
<ui:define name="content">
<h:form id="headForm">
<p:tabView id="tabV" dynamic="true" cache="true"
style="width: 1000px">
<p:tab title="Something">
<h:form id="child">
<p:dataTable id="dab" styleClass="margin-top-20" var="pro"
value="#{project.criteriaList}">
<p:column headerText="ID">
<h:outputText value="#{pro.id}" />
</p:column>
<p:column headerText="Name">
<h:outputText value="#{pro.name}" />
</p:column>
<p:column headerText="Description">
<h:outputText value="#{pro.description}" />
</p:column>
</p:dataTable>
<p:tabView dynamic="true" cache="true">
<p:tab title="Nope">
</p:tab>
<p:tab title="Button">
<h:form>
<!-- NIE DZIALA -->
<p:commandButton value="Zaladuj" actionListener="#{project.addSomething}" update=":headForm:tabV:child:dab" />
</h:form>
</p:tab>
</p:tabView>
</h:form>
</p:tab>
</p:tabView>
</h:form>
<!-- DZIALA -->
<h:form>
<p:commandButton value="Zaladuj" actionListener="#{project.addSomething}" update=":headForm:tabV:child:dab" />
</h:form>
</ui:define>
</ui:composition>
</html>
I mamy dwa przypadki
- Przypadek
- W miejscu gdzie zakomentowałem kod poprzez to ten p:commandButton nie jest zagniezdzony i gdy w niego kliknę to natychmiastowo bez przeładowania strony pojawiają mi się wyniki w <p:dataTable id="dab">
output konsoli:
ProjectBean Constructor()
ADD SOMETHING()
- Przypadek
- W miejscu gdzie zakomentowałem kod poprzez to ten p:commandButton jest dosyc mocno zagniezdzony i gdy w niego klikam to nic się nie dzieje, nie pojawiają się żadne wyniki w <p:dataTable id="tab"> jest po prostu pusto. Z output konsoli wynika, że wykonany jest konstruktor beana, ale jego metoda addSomething() juz nie jest wywolywana.
output konsoli
ProjectBean Constructor()
Jak widać, został wywołany tylko konstruktor beana. Zaś w 1. Przypadku został wywołany i konstruktor i metoda addSomething()
Jak mogę rozwiązać ten problem, bym mógł bez problemowo zaktualizować elementy na stronie bez przeładowywania strony za pomocą zagniezdzonego <p:commandButton> ??
Jeżeli chodzi o nazwy ID itp. to są tylko testowe.