2016-11-15 16 views
0

我從2個星期以來面臨一個巨大的問題。OneMenu&2 ajax裏面不會工作

我一個一個測試了2個Ajax方法,他們工作。但是當我想要在一個菜單中同時使用時,應該更新頁面的第三個菜單的下拉菜單不起作用。

<h:body> 
     <h:form> 

      <p:growl id="growl" showDetail="true" /> 
      <p:outputLabel value="Sélectionner une section " for="sectionBox"/> 
      <p:selectOneMenu id="sectionBox" 
          value="#{evaluationViewController.currentSection}" 
          converter="sectionConverter" 
          var="c" 
          filter="true" 
          filterMatchMode="startsWith" 
          effect="fade" 
          > 
       <p:ajax listener="#{evaluationViewController.onSectionSelected}" update="ue,ueO,growl"/> 
       <f:selectItem itemLabel="Sélectionnez uen section" itemValue="" noSelectionOption="true"/> 
       <f:selectItems value="#{evaluationViewController.currentSections}" 
           var="currentSection" 
           itemLabel="#{currentSection.name}" 
           itemValue="#{currentSection}" 
           /> 
       <p:column> 
        <h:outputText value="#{c.name}"/> 
       </p:column> 
      </p:selectOneMenu> 

      <p:outputLabel value="Sélectionner une UE " for="ue"/> 
      <p:selectOneMenu id="ue" 
          value="#{evaluationViewController.ue}" 
          converter="ueConverter" 
          var="u" 
          filter="true" 
          filterMatchMode="startsWith" 
          > 
       <p:ajax listener="#{evaluationViewController.onUeSelected}" update="ueO,growl"/> 
       <p:ajax event="change" update="capacities" listener="#{evaluationViewController.listenerCapacitiesUpdate}"/> 
       <f:selectItem itemLabel="Sélectionnez une UE" itemValue="" noSelectionOption="true"/> 
       <f:selectItems value="#{evaluationViewController.ues}" 
           var="ues" 
           itemLabel="#{ues.name}" 
           itemValue="#{ues}" 
           /> 

       <p:column> 
        <h:outputText value="#{u.name}"/> 
       </p:column> 
      </p:selectOneMenu> 

      <p:outputLabel value="Sélectionner l'UE enseignée" for="ueO"/> 
      <p:selectOneMenu id="ueO" 
          value="#{evaluationViewController.organizedUe}" 
          converter="organizedUeConverter" 
          var="o" 
          filter="true" 
          filterMatchMode="startsWith" 
          > 
       <f:selectItem itemLabel="Sélectionnez une année" itemValue="" noSelectionOption="true"/> 
       <f:selectItems 
        value="#{evaluationViewController.organizedUes}" 
        var="organizedUes" 
        itemLabel="#{organizedUes.name}" 
        itemValue="#{organizedUes}" 
        /> 
       <p:column> 
        <h:outputText value="#{o.name}"/> 
       </p:column> 

       <p:column> 
        <h:outputText value="#{o.level.name}"/> 
       </p:column> 
      </p:selectOneMenu> 

      <p:separator/> 
      <p:separator/> 

      <p:dataTable id="capacities" 
         var="cap" 
         value="#{evaluationViewController.capacities}" 
         editable="true" 
         editMode="cell" 
         widgetVar="cellCap" 
         > 

       <f:facet name ="header"> 
        Capacitées 
       </f:facet> 

       <p:ajax event="cellEdit" 
         listener="#{evaluationViewController.onCellEdit}" 
         update="@this"/> 

       <p:column headerText="Dénomination"> 
        <p:cellEditor> 
         <f:facet name="output"><h:outputText value="#{cap.name}"/></f:facet> 
         <f:facet name="input"><p:inputText value="#{cap.name}" style="width: 30%" label="Dénomination"/></f:facet> 
        </p:cellEditor> 
       </p:column> 

       <p:column headerText="Description"> 
        <p:cellEditor> 
         <f:facet name="output"><h:outputText value="#{cap.description}"/></f:facet> 
         <f:facet name="input"><h:inputText value="#{cap.description}" style="width: 90%" label="Description"/></f:facet> 
        </p:cellEditor> 
       </p:column> 

       <p:column headerText="Réussite obligatoire"> 
        <p:selectBooleanCheckbox value="#{cap.isThresholdOfSuccess}" style="alignment-adjust: central"/> 
       </p:column> 

      </p:dataTable> 

      <p:separator/>    

     </h:form> 
    </h:body> 

我跟着primefaces演示,以及爲bean:

public class EvaluationViewController implements Serializable { 
@EJB 
private SectionFacade ejbSectionFacade; 
private List<Section> currentSections; 
private Section currentSection; 

@EJB 
private UeFacade ejbUeFacade; 
private List<Ue> ues; 
private Ue ue; 

@EJB 
private OrganizedUeFacade ejbOrganizedUeFacade; 
private List<OrganizedUe> organizedUes; 
private OrganizedUe organizedUe; 

@EJB 
private CapacityFacade ejbCapacity; 
private List<Capacity> capacities; 
private Capacity capacity; 
@PostConstruct 
public void init() { 
    currentSections = ejbSectionFacade.findAll(); 
    ues = new ArrayList<>(); 
    organizedUes = new ArrayList<>(); 
    capacities = new ArrayList<>(); 
} 

public void onSectionSelected() { 
    if (currentSection != null && !currentSection.getName().equals("")) { 
     ues = ejbUeFacade.findBySection(currentSection); 
     ue = null; 
     capacity = null; 
     FacesMessage facesMessage = new FacesMessage("Sélection", currentSection.getName()); 
     FacesContext.getCurrentInstance().addMessage(null, facesMessage); 
    } else { 
     ues = null; 
    } 
} 

public void onUeSelected() { 
    if ((currentSection != null && !currentSection.getName().equals("")) 
      && (ue != null && !ue.getName().equals(""))) { 
     organizedUes = ejbOrganizedUeFacade.findByUe(ue); 
     capacities = ejbCapacity.findByUe(ue); 
     capacity = null; 
     FacesMessage facesMessage = new FacesMessage("Sélection de l'UE : ", ue.getName()); 
     FacesContext.getCurrentInstance().addMessage(null, facesMessage); 
    } else { 
     organizedUes = null; 
    } 
} 

public void listenerCapacitiesUpdate() { 
    capacities = ejbCapacity.findByUe(ue); 
} 

數據表進行更新和渲染,但不是最後oneMenu。我真的不明白。我會很樂意回答。

+0

請創建一個[mcve]並具體說明哪個組件不更新其他組件。而兩個ajax標籤中,沒有一個是事件。所以如果默認意外是'更改',第二個覆蓋另一個 – Kukeltje

+0

謝謝!它的作品非常棒! –

+0

在第一個'p:ajax'中更改或者添加一個顯式的不同事件?那麼讓我創建一個答案。我不認爲有這個問題的重複,但 – Kukeltje

回答

1

有手頭這裏兩件事情:

  • 如果你不提供顯式事件,然後一個默認取
  • 你不能在兩個AJAX標籤添加到同一個組件聽同事件

因此,如果在這種情況下,p:selectOneMenu的默認AJAX事件change,只有第二個將被處理。 添加比change其他明確的事件,第一AJAX處理器將使其工作

題外話,但你通常應該做的調試問題,像這樣重要的事情:

  • 找到兩個之間的差異看,並設法使他們的一致地
  • 看看順序切換它們發揮作用
  • 如果使用的是不同的組件使得它的工作
01參見
相關問題