2016-07-18 15 views
0

benutze Ich arbeite mit Primefaces 5.3.Primefaces p: selectOneMenu oder p: selectBooleanCheckbox nicht feuern change-event je nachdem ob ich h: form

Zuerst implementiert ich Funktionalität Sichtbarkeit ap zu ändern: selectOneMenu auf dem Wert von p abhängig: selectBooleanCheckbox nach diesem Beitrag:

Enabling and disabling components via select checkbox

Die bisher funktioniert, wenn ich die h verwenden: Form .

Als nächstes wollte ich die Werte in der Bean aktualisieren, wie im p: selectOneMenu ausgewählt. Hier beginnt meine Frage: Selbst wenn ich p: ajax explizit zum Aufrufen eines Listeners verwende, wird dieser nicht aufgerufen. Dies ist mein Code:

<h:panelGrid> 
      <p:selectOneMenu value="#{schedulerCDIBean.selectedParentTask}" var="parentTask" id="taskDependence" disabled="#{task.dependsOn != 'true'}"> 

       <p:ajax event="change" listener="#{schedulerCDIBean.taskToAddListener}"/> 

       <f:selectItems id="taskDependenceItems" value="#{schedulerCDIBean.taskWebDataObjectList}" var="item" itemLabel="#{item.taskName}" 
       itemValue="#{item}" /> 

       <p:column> 
        <h:outputText value="#{parentTask}"/> 
       </p:column> 

    </p:selectOneMenu> 
</h:panelGrid> 

Und hier ist, wie ich aktivieren/die selectOneMenu deaktivieren:

<p:selectBooleanCheckbox id="dependsOnTask" value="#{task.dependsOn}" itemLabel="Depends On">  
     <p:ajax update="taskDependence" process="@this"/> 
</p:selectBooleanCheckbox> 

Das alles lebt in ap: Reiter des p: accordionPanel wo 'Aufgabe' ist die var von meine DataObject-Liste.

Wie in diesem Beitrag von @BalusC erwähnt: commandLink/commandButton/ajax backing bean action/listener method not invoked (Mögliche Ursachen: 2),

"Sie können mehrere UIForm Komponenten in nicht miteinander Nest."

Also, wenn ich die h: form-Direktive entfernen, funktioniert der Aufruf an den Listener in der Bean. Aber jetzt ist der Wert der p: selectBooleanCheckbox immer auf 'false' gesetzt und somit wird die Komponente nicht auf sichtbar aktualisiert.

Ich fand einen Beitrag here, wo OP hatte das gleiche Problem und löste es durch Hinzufügen der h: form-Anweisung.

EDIT: Meine 'Form' ist eine ui: Zusammensetzung und beginnt wie dieses <ui:composition template="/templates/pages/mainPage.xhtml">, wo mainPage.xhtml enthält h: Kopf und schließt die 'header.xhtml' von ui mit: include, und es gibt ah: Form . Aber diese h: -Form ist schon vorher geschlossen, also ist das Problem nicht hier.

Nun, ich möchte nicht den Weg gehen mit dem Hinzufügen der h: Form erneut, da es zu unspezifizierten Verhalten führt. Aber was mache ich falsch, wenn meine p: selectBooleanCheckbox Werte nicht richtig eingestellt sind?

Vielen Dank für Ihre Hilfe!

UPDATE

Das Problem war nicht die h: Form, wie es war eigentlich nicht verschachtelt. Jetzt bin ich nur noch mit den Zuhörern für das p: selectOneMenu fest, da sie nicht angerufen werden. Ich habe auch versucht, partialSubmit="true" auf <p:ajax />, die bisher nicht zu einer Lösung führte.

+0

Haben Sie Setter/Getter auf 'selectedParentTask' haben? Wie sieht Ihre Listener-Methode 'taskToAddListener' aus? Hast du versucht, einen 'p: remoteCommand' zu verwenden? – chaeschuechli

+0

@chaeschuechli Ja, ich habe den Getter/Setter und die Signatur des Hörers sieht so aus: 'public void taskToAddListener (AjaxBehaviorEvent event)'. Aber das Problem ist mit der p: selectBooleanCheckbox (task.dependsOn), wo der Wert immer auf 'falsch' gesetzt ist. Es ist nicht mehr mit der ausgewähltenParentTask, seit ich die h: Form losgeworden bin. Ich habe gerade versucht, den folgenden Ansatz mit p: Remotecommand ' \t \t \t \t \t ', was auch nicht funktioniert hat. Vielen Dank für Ihre Hilfe – danny

+0

In Ihrem Tag innere selectBooleanCheckbox müssen Sie eine Listener-Methode aufrufen, die den booleschen Wert aktualisiert. – chaeschuechli

Antwort

1

Danke für Ihre Hilfe, Leute. Mit deiner Hilfe habe ich das Problem behoben.

Genau wie wenn jemand andere Erfahrungen mit ähnlichen Problemen, hier ein paar Dinge zu überprüfen:

  1. prüfen @ BalusC Antwort here, wie auch in @ irieill Antwort erwähnt.
  2. Überprüfen Sie, ob Sie equals() und hashCode() des Objekts haben, das Sie im selectOneMenu anzeigen möchten.

Die Lösung für meine Situation tatsächlich in @ irieill Kommentar erwähnt wurde:

[..] Keine richtiger Wandler Bereitstellung wirft keine Ausnahmen, sondern Gesichter Fehlermeldungen. Versuchen Sie daher, Ihrer Seite einen <p:growl autoUpdate="true" /> hinzuzufügen, um festzustellen, ob ein Konvertierungsfehler vorliegt. Wenn ja, fügen Sie Ihrem selectOneMenu einen Treiberkonverter hinzu.

Ich denke, das ist auch, was @BalusC am Punkt 3 seiner Liste der möglichen Ursachen gesagt hat.

Siehe auch: How to write a custom converter for <p:pickList>, Custom converter in JSF 2.0, PrimeFaces ShowCase: SelectOneMenu

0

Wie in diesem Beitrag von @BalusC erwähnt: commandLink/commandButton/ajax backing bean action/listener method not invoked

Beachten Sie auch Punkt 1. Sie müssen Ihre Eingabekomponenten mit einem <h:form /> Tag umschließen.

Nun, ich möchte nicht den Weg gehen mit dem Hinzufügen der h: Form wieder, wie es zu unspezifizierten Verhalten führt.

Wie ich verstehe, missbrauchen Sie das Tag oder Sie verstehen nicht, wie Sie es verwenden. Schließen Sie einfach Ihre gesamte Seite (oder zumindest alle Eingabekomponenten) in ein <h:form />-Tag ein und es sollte funktionieren.

Können Sie Ihre Frage bitte mit dem Seitencode aktualisieren, der auch die Zeilen enthält, an denen Sie die <h:form />-Tags platziert haben.

+0

Ich habe meine Frage bearbeitet. Ich hoffe, es ist klar genug. – danny