Wie kann ich eine Änderung am EntityState einer Entität feststellen?

8

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.

    
Ward 12.01.2013, 21:00
quelle

2 Antworten

10

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:

  1. 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).

  2. 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.

    
Ward 12.01.2013, 21:10
quelle
0

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%     
Frank.Germain 04.04.2014 04:51
quelle

Tags und Links