Ich möchte eine "Löschen" -Schaltfläche und eine "Abbrechen" -Schaltfläche in jeder Zeile einer Kundenliste einfügen. Die Schaltfläche "Abbrechen" ist deaktiviert, wenn ein Kunde "Unverändert" ist. Wenn ein Kunde jedoch in einen geänderten Zustand übergeht ("Hinzugefügt", "Geändert", "Gelöscht"), möchte ich die Schaltfläche "Abbrechen" aktivieren, damit der Benutzer die Änderungen - egal was sie sind - vor dem Speichern rückgängig machen kann / p>
Ich kann das fast tun, indem ich customer.entityAspect.propertyChanged
abonniere. Eine Änderung der Eigenschaft signalisiert eine mögliche Änderung in EntityState
. Ich kann dieses Ereignis abonnieren und meinen Sachbearbeiter dazu bringen, ein isChanged
Observable, das ich meinen Kundeneinheiten hinzugefügt habe, zu aktualisieren. Dann verbinde ich die "Cancel" -Schaltfläche mit dem isChanged
und es geht mir gut.
Das propertyChanged
-Ereignis wird jedoch nur ausgelöst, wenn sich eine -Dateneigenschaft ändert, z. B. customer.Name("New Co.");
. Es wird nicht ausgelöst, wenn der Benutzer auf die Schaltfläche "Löschen" klickt. "Delete" löst customer.entityAspect.setDelete();
aus, das eine Dateneigenschaft nicht berührt; Es ändert einfach die EntityState
des Kunden.
(1) Warum ändert sich die EntityState
des Kunden nicht? propertyChanged
und (2) wie kann ich auf eine Änderung von EntityState
warten, damit ich die Schaltfläche "Abbrechen" steuern kann?
S.S .: Ich benutze Knockout.
PPS: Diese Frage wurde von einer früheren SO-Frage inspiriert " entityAspect.setDeleted löst das abonnierte propertyChanged-Ereignis " nicht aus.
Du hast Recht, dass Breeze propertyChanged
nicht erhöht, wenn sich EntityState
ändert. Vielleicht sollte es. Wir werden darüber nachdenken.
Breeze hat auch kein separates Ereignis für die Entität - kein entityStateChanged
-Ereignis, um Sie zu benachrichtigen, wenn sich die EntityState
ändert. Wir haben das mehrfach in Betracht gezogen. Wir reden immer wieder davon.
Es gibt eine vollkommen gute Lösung, die besser abschneidet als ein dediziertes entityStateChanged
Event. Jetzt müssen Sie es selbst programmieren.
Der Trick ist, auf EntityManager
zu hören, nicht auf die Entity. Eine Variante dieser Lösung finden Sie im Beispiel DocCode "Teach-Tests" ; Suchen Sie nach " kann benutzerdefinierte ko entityState -Eigenschaft über entityManager.entityChanged " im Modul entityTest.js steuern.
Ich passe das an, um zu deinem Beispiel zu passen. Die Essenz davon ist wie folgt:
Abonnieren Sie das entityManager.entityChanged
-Ereignis; Wenn und die Ursache dafür ist, dass sich die EntityState
einer Entität geändert hat, aktualisierst du die isChanged
boolean KO-Observable dieser Entität (falls diese Eigenschaft existiert).
Fügen Sie die isChanged
Observable zu Entitätstypen hinzu, die auf diese Weise überwacht werden sollen.
Hier ist ein Beispiel für Schritt # 1: Abhören von Statusänderungen
%Vor%Lassen Sie uns über Schritt 2 sprechen: Fügen Sie% ob_de% beobachtbar zum Typ hinzu. Du scheinst das angepackt zu haben, aber ich weiß nicht wie. Vielleicht ist der beste Ort, um es dem Typ hinzuzufügen, im Initiator der Initialisierung Sie können sicher sein, dass die Eigenschaft vorhanden ist, unabhängig davon, ob die Entität durch eine Abfrage erstellt oder materialisiert wird. Hier ist ein Beispiel:
%Vor% Das alles scheint eine Menge Arbeit zu sein. Es wäre einfacher, wenn Breeze das isChanged
-Ereignis anhebt, wenn sich propertyChanged
ändert. Wir werden das mehr berücksichtigen ... es kann einige gute Gegenargumente geben. In der Zwischenzeit denke ich, was Sie hier sehen, ist der beste Ansatz.
Wir haben festgestellt, dass das Einbinden des Brise-Entity-Managers in unsere eigenen uns eine schöne Flexibilität gibt, die diese Herausforderung zu einem Spaziergang im Park macht, insbesondere mit dem hasChangesChanged-Event.
%Vor%Zeigen Sie dann in Ihren viewModels den EntityManager an.
%Vor%Dann in deiner Knockout-Benutzeroberfläche:
%Vor%Tags und Links breeze