2 Stimmen

Wie kann ich ein 'change'-Ereignis eines Dropdowns von einem abhängigen Observable in Knockout.JS abbrechen?

Hier ist das Setup:

Ein Benutzer befindet sich auf der Seite "A". Es gibt ein Dropdown (DROPDOWN) zur Navigation. Es gibt 2 Optionen, aus denen der Benutzer wählen kann: A, B. Wo A die aktuelle Seite repräsentiert und B etwas ist, wohin der Benutzer gehen möchte.

Dieses Dropdown ist an ein abhängiges Observable (GUARD) gebunden, das ein anderes reguläres Observable (TARGET) lesen und möglicherweise SCHREIBEN kann, das den Zustand des Dropdowns enthält.

DROPDOWN <-- --> GUARD <-- ?--> TARGET

Die Idee ist, dass wenn der Benutzer etwas im Dropdown auswählt, um von der Seite wegzunavigieren, erst überprüfen wir, ob ungespeicherte Änderungen vorhanden sind und falls ja, fragen wir den Benutzer, ob er sie verwerfen möchte oder auf der Seite bleiben und mit dem Bearbeiten fortfahren möchte.

Also die Situation: Es gibt ungespeicherte Änderungen. Der Benutzer wählt etwas aus dem Dropdown aus. Der GUARD tritt ein, indem seine 'write'-Methode aufgerufen wird. Wir fragen den Benutzer, ob er die Änderungen verwerfen und die Seite verlassen oder bleiben möchten. Der Benutzer wählt zu bleiben. Wir sagen 'gut' und die 'write'-Methode tut nichts, so dass das Ziel-Observable intakt bleibt. Ende der Geschichte! Aber..

Weil der Benutzer das Dropdown berührt hat und das 'change'-Ereignis nicht abgebrochen wurde (es gibt keine Mittel, dies innerhalb eines gebundenen Observables zu tun), wurde das Dropdown auf den Zustand "B" gesetzt, als ob der Benutzer beschlossen hätte, die Seite zu verlassen.

Also ist meine Frage einfach:

  • Gibt es eine Möglichkeit, das 'change'-Ereignis innerhalb der 'write'-Methode des abhängigen Observables, an das das Dropdown gebunden ist, abzubrechen?

  • Wenn nicht, wie komme ich aus dieser Situation heraus und halte die Auswahl des Dropdowns synchron mit dem TARGET-Observable?

2voto

antishok Punkte 2910

Das 'change'-Ereignis tritt nach der Änderung des Dropdowns auf, daher wäre eine einfache Lösung, das Dropdown dazu zu veranlassen, mit dem alten Wert "aktualisiert" zu werden, was mit einem Aufruf von target.valueHasMutated() leicht erledigt werden kann. Beispiel fiddle: http://jsfiddle.net/KXhem/77/

Bearbeitung: Seit Knockout 3 benachrichtigen Computeds nur noch, wenn sich ihr Wert wirklich geändert hat. Um das gleiche Verhalten zu erreichen, können Sie .extend({ notify: 'always' }) zum Computed hinzufügen. Weitere Details finden Sie hier: http://knockoutjs.com/upgrade-notes/v3.0.0.html

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X