Wenn man ein Löschkommando ohne Bestätigungsdialog mit einer Ausführbarkeitsregel, die auf das zu löschende Objekt zugreift, aus dem Kontext-Menü aufruft, dann erzeugt das einen Fehler, weil die Ausführbarkeitsregel nacht der Löschung noch einmal auf dem dann gelöschten Objekt ausgewertet wird.
Analyse
Kommandos im Kontextmenü sind fest an das Objekt gebunden, auf denen das Kontext-Menü geöffnet wurde. Die Ausführung eines Kommandos im Kontextmenü schließt zwar das Kontext-Menü, aber das Schließen wird vom Browser-Window-Control bis zur abschließenden Validierung des Kommandos verzögert. Damit bleiben auch alle Kommndos im Kontextmenü bis zur abschließenden Validierung in der Command-Model-Registry registriert. Wenn man Pech hat, dann wird die Command-Model-Registry in der abschließenden Validierung vor dem Browser-Window-Control validiert und wertet die Ausführbarkeitsregeln noch einmal auf dem jetzt gelöschten Objekt aus (was den Crash verursacht).
Lösung
Beim Schließen eines Popup-Dialogs muss dieser sofort abgemeldet werden, damit auch die in ihm enthaltenen Kommandos aus der Command-Model-Registry abgemeldet werden. Nur das letztendliche Entfernen von der UI kann bis zur endgültigen Validierung des Browser-Window-Controls verzögert werden.
Test
- Tabelle mit Löschbefehl auf den Zeilen konfiguriern.
- Rückfrage für den Löschbefehl ausschalten.
- Ausführbarkeitsregel für den Löschbefehl konfigurieren, die z.B. anhand des Namens des Objektes entscheidet, ob es gelöscht werden kann oder nicht.
- Löschbefehl über das Kontext-Menü der Tabelle ausführen.
- Es darf kein Fehler aufgrund eines Zugriffs auf ein gelöschtes Objekt auftreten.