2016-07-22 37 views
0

Ich benutze PrimeFaces 5.0 (kann aufgrund anderer Probleme nicht aktualisiert werden). Ich habe ein SelectOneMenu. Ich habe ein onchange-Ereignis an es gebunden, so dass, wenn der Benutzer es ändert, ich mit confirm() den Benutzer auffordern kann, die Aktion zu bestätigen. Wenn der Benutzer auf Nein klickt, muss ich den alten Wert zurückgeben.Wie können Sie während eines Onchange-Ereignisses den Wert und den angezeigten Wert von PrimeFaces SelectOneMenu über JavaScript ändern?

Das Menü sieht wie folgt aus:

<p:selectOneMenu 
    id="referenceTable" 
    widgetVar="referenceTable" 
    style="width:45%" 
    value="#{maintRefTabUi.selectedReferenceTable}" 
    onchange="changeReferenceTableDropdown();" 
> 
...snip... 

Die Funktion sieht wie folgt aus: Brennen zweimal

function changeReferenceTableDropdown() { 
    if (DirtyFlag.isDirty) { 
     if (confirm('You have unsaved changes. Do you want to discard your changes and switch to another reference table?')) { 
      DirtyFlag.resetDirtyFlag(); 
      changeReferenceTable(); 
     } else { 
      // Pick one below 

      // Attempt 1: The .value property is reverted, but displayed value isn't 
      document.forms['tableSelectForm'].reset(); 

      // Attempt 2: Same as attempt 1 
      PF('referenceTable').value = PF('referenceTable').preShowValue.val(); 

      // Attempt 3: The dropdown box is reverted, but onchange got fired twice 
      PF('referenceTable').selectValue(PF('referenceTable').preShowValue.val()); 

      // Attempt 4: .value and visually reverted, but if you click the dropdown box, the selected value jumps back to the discarded value 
      PF('referenceTable').revert(); 

     } 
    } else { 
     changeReferenceTable(); 
    } 
} 

Ich bin unfähig, etwas in Bezug auf .selectValue() und onchange() Ereignis zu finden. Da JavaScript-Einstellung .value nicht onchange() ausgelöst wird, kann .selectValue() fire onchange() einen Fehler enthalten.

Gibt es eine Möglichkeit, onchange() zu unterdrücken? Ich habe auch onchangechange = null versucht; und legte es danach zurück, aber es hat nicht funktioniert (onchange wird immer noch gefeuert).

Oder gibt es eine Möglichkeit, SelectOneMenu seine Anzeige entsprechend .value zu aktualisieren?

Antwort

0

ich dies am Ende tun: mit dem SelectOneMenu assoziiert

In dem Setter, sparte ich den alten Wert in einem anderen Mitglied variabel.

Im Ereignis onchange() des SelectOneMenu, wenn der Benutzer abgebrochen hat, rufe ich eine neue Methode in der Bean auf, um den alten Wert wiederherzustellen, und dann das SelectOneMenu zu aktualisieren.

Mehr Fahrten zum Server, anstatt es auf der Clientseite zu blockieren, aber es wird zumindest die Arbeit erledigt.

0

Warum verwenden Sie nicht den Primefaces-Bestätigungsdialog?

http://www.primefaces.org/showcase/ui/overlay/confirmDialog.xhtml

Ich könnte mir vorstellen, dass Ihr Problem veraltet sein, weil Sie nicht auf Javascript-Code verlassen müssen.

Ich hoffe, das hilft!

+0

Ich versuchte es; Bei Verwendung des Bestätigungsdialogs tritt dasselbe Problem auf, dass das SelectOneMenu den neuen Wert verwendet, selbst wenn der Benutzer den Vorgang abgebrochen hat. Es ist das Ereignis onchange(), daher wird die Änderung bereits auf dem clientseitigen SelectOneMenu angewendet. Wenn ich nur ein Onclick-Event auf dem SelectOneMenu! –

+0

Könnte dies helfen ..? http://stackoverflow.com/questions/18787653/invoke-action-method-on-click-of-hselectonemenu – chaeschuechli

+0

Der verlinkte Artikel empfiehlt die Verwendung eines ValueChangedListener ... so ist es bereits an die Bohne übergeben. Ich möchte es auf der Clientseite blockieren und wenn der Benutzer abgebrochen wird, den alten Wert in der Dropdown-Box beibehalten. –