Primefaces abhängig selectOneMenu und required="true"

In meiner Anwendung habe ich drei dropdown-Menü (p:selectOneMenu), sagen wir A, B, C. Unter Ihnen zwei angewiesen sind, sagen wir B und C Durch die änderung wird der Wert von B ich bin dynamisch laden Werte auf C. Außerdem gibt es eine textbox. Der Wert der textbox wird die Erzeugung von ajax, wenn das change-Ereignis wird ausgelöst von diesen drei dropdowns.

Hier ist das xhtml:

<p:selectOneMenu id="customerMenu" value="#{adminController.activityDTO.customerId}" required="true" label="Customer Name" style="width: 200px">
    <f:selectItem itemLabel="Select One" itemValue="" />
    <f:selectItems value="#{adminController.customers}" var="customer" itemLabel="#{customer.customerName}" itemValue="#{customer.customerId}" />
    <p:ajax listener="#{adminController.generateActivityName}" update="activityId" />                       
</p:selectOneMenu>

<p:selectOneMenu id="activityTypeMenu" value="#{adminController.activityDTO.activityParentType}" required="true" label="Activity Type"
    style="width: 200px">
    <f:selectItem itemLabel="Select One" itemValue="" />
    <f:selectItems value="#{adminController.activityTypes}" var="activityType" itemLabel="#{activityType.parent}" itemValue="#{activityType.parent}" />
    <p:ajax listener="#{adminController.updateDependentActivity}" update="activitySubType" />
</p:selectOneMenu>

<p:selectOneMenu id="activitySubTypeMenu" value="#{adminController.activityDTO.activitySubType}" required="true" label="Activity Sub Type"
    style="width: 200px">
    <f:selectItem itemLabel="Select One" itemValue="" />
    <f:selectItems value="#{adminController.activitySubTypes}" var="activityType" itemLabel="#{activityType.name}" itemValue="#{activityType.id}" />
    <p:ajax listener="#{adminController.generateActivityId}" update="activityId" />
</p:selectOneMenu>

<p:inputText id="activityId" autocomplete="off" readonly="true" value="#{adminController.activityDTO.activityId}"
    label="#{adbBundle['admin.addActivityPanel.addActivityTable.activityId']}" required="true" />

Den activityTypeMenu und activitySubTypeMenu sind abhängig vom gewählten Wert des activityTypeMenu ich bin bevölkern die activitySubTypeMenu.

Nun die Probleme, ich bin vor ist:

  • Sagen, ich habe wählen Sie "Externen" und "Internen" in activityTypeMenu und Standard "Wählen Sie Eine". Wenn ich wählen Sie "Extern" aus activityTypeMenu die activitySubTypeMenu haben, "Projekt" und "Service". Aber dann, wenn ich wählen Sie die Voreinstellung "Wählen Sie" die activitySubTypeMenu hält immer noch die zuvor dynamisch aufgefüllt Werte. Dies ist, weil die required="true" Attribut Widerstand gegen Feuer backend-Methode, von denen ich bin laden der dynamische Wert.
  • Ich habe versucht, die itemValue von <f:selectItem itemLabel="Select One" itemValue="" /> zu #{null} und dann die backend-Methode reagiert auf das auswählen der "Select-one" - option und ich kann eine leere Liste zu activitySubTypes und auf diese Weise die activitySubTypeMenu bekommen leer. In diesem Fall ist aber die required="true" ist immer sinnlos. Ich meine, ich habe auch Schaltfläche speichern und auf Klick auf die Schaltfläche ohne Auswahl einer option (das ist die Auswahl "Select-one") aus activityTypeMenu und activitySubTypeMenu nicht werfen ValidatorException und die Komponenten sind nicht immer gestylt durch die Fehler die css-Klasse Primefaces.
  • Auch wenn ich nicht die itemValue von <f:selectItem itemLabel="Select One" itemValue="" /> zu #{null} dann auf ändern, um ausgewählten Wert zu Standard-option("Select-one") nicht, Entrümpelung der activityId p:inputText. Wenn ich #{null} dann bekomme ich die backend-Methode Schießen aus der ich den Wert der textbox zu leeren.

Wie ca ich lösen diese Probleme und erhalten gewünschten Ergebnis. Was ich will sind:

  • Wenn die option auf "Wählen Sie eine" und dann die abhängigen Menü leer und der textbox.
  • Ich will das required="true" Attribut.
  • Haben Sie versucht, mit process="@this" Attribut in p:ajax - tags? , Die verhindert, dass die Validierung anderer form-Komponenten, denn nur die Komponente, die Sie ändern, werden von der JSF-lifecycle. Wenn nicht funktioniert, ist die einfachste (aber nicht beste) Weg, um es Arbeit wäre, loszuwerden required="true" Attribute und überprüfen das ganze Formular vollständig aus, wenn es gesendet wird. Viel Glück.
  • Aber ich denke schon p:ajax standardmäßig @this.
  • ja die p:ajax Standardwert ist @this
  • Versuchen, die noSelectionOption="true" Flagge auf Ihrem <f:selectItem/>. Es ist ein reserviertes flag, das bewirkt, dass die Laufzeit für die Bewertung Ihrer Auswahl anders.
  • nach code.google.com/p/primefaces/issues/detail?id=4582 es hat bug mit noSelectionOption.
InformationsquelleAutor Tapas Bose | 2013-01-26
Schreibe einen Kommentar