OneMenu & 2 ajax inside 不起作用

OneMenu & 2 ajax inside won't work

两周以来我一直面临着一个大问题。

我一一测试了 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>

对于 bean,我也遵循了 primefaces 演示:

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);
}

DataTable 已更新并呈现,但不是最后一个菜单。我真的不明白。我将非常感谢您的回答。

这里有两件事:

  • 如果您不提供显式事件,则采用默认事件
  • 您不能将两个 ajax 标记添加到侦听同一事件的同一组件

因此,如果在这种情况下 p:selectOneMenu 的默认 ajax 事件是 change,则只会处理第二个事件。 change 以外的显式事件添加到第一个 ajax 处理程序将使它工作

题外话但重要的事情你通常应该像这样调试问题:

  • 找出两者之间的差异,看看并尽量使它们相同
  • 通过切换它们看看顺序是否起作用
  • 看看使用不同的组件是否能正常工作