OneMenu& 2 ajax inside不起作用

时间:2016-11-15 16:43:31

标签: ajax primefaces dropdown selectonemenu

自2周以来,我面临着一个巨大的问题。

我一个接一个地测试了2个ajax方法,它们起作用了。但是当我想要在oneMenu中同时存在时,下拉列表应该更新页面的第三个单一节点不起作用。

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

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

1 个答案:

答案 0 :(得分:1)

这里有两件事:

  • 如果您未提供explict事件,则会采用默认事件
  • 您无法将两个ajax标记添加到侦听同一事件的同一组件

因此,如果在这种情况下p:selectOneMenu的默认ajax事件为change,则仅处理第二个事件。 向第一个ajax处理程序添加change以外的显式事件将使其正常工作

偏离主题但重要的事情,你通常应该做这样的调试问题:

  • 找出两者之间的差异并查看并尽量使它们尽可能相同
  • 查看订单是否通过切换来发挥作用
  • 查看是否使用其他组件使其正常工作