Verbesserung
Wichtig
Detail
Fehlerbehebung
Wichtig
Detail
Wichtig
#27105
Dynamisches Abonnieren von Modell-Events durch UI-Elemente
Aktuell können nur Komponenten auf Modell-Events reagieren. Dabei erhält jede Komponente alle Modell-Events (einzeln). Es gibt keine Möglichkeit, wie ein UI-Element (tl:Control) auf eine Modell-Änderung reagieren kann. Das UI-Element ist davon abhängig, dass die Komponente auf die Änderung reagiert und das Modell des Controls aktualisiert. Dafür muss die Komponente aber alle in ihrem Kontext dargestellten Modelle kennen.
Verbesserung
Ein tl:Control soll ein Fachobjekt direkt als Modell verwenden können und z.B. eine Darstellung dafür produzieren. Im Gegenzug soll das Contrl in der Lage sein, selbstständig auf Änderungen an dem dargestellten Fachobjekt zu reagieren und seine Darstellung zu aktualisieren.
Neue API
- tl:FrameScope erhält eine Methode getModelScope(), die einen tl:ModelScope liefert.
- Ein tl:ModelScope stellt Methoden zur Verfügung um tl:ModelChangeEvent Benachrichtigungen zu abonieren.
- Ein Empfänger von Modell-Events muss das Interface tl:ModelListener implementieren.
Code Migration
Updates für TLObjects
Komponenten werden nur noch über das Erstellen, Ändern und Löschen von TLObjects informiert, wenn sie das abonnieren. Dazu gibt es folgende Hooks in tl:LayoutComponent:
- getObjectsToObserve(): Die Komponente wird über Änderungen und Löschungen dieser Objekte informiert.
- getTypesToObserve(): Die Komponente wird über alle Instanzen dieser Typen und deren Ableitungen informiert. (Erstellung, Änderung, Löschung)
- observeAllTypes(): Wenn eine Komponente über alles informiert werden muss. Das sollte nur benutzt werden, wenn es unbedingt notwendig ist, da es unnötige Last erzeugt.
- Alle Komponenten werden automatisch für ihr Modell (getModel()) als Listener registriert. Wenn eine Komponente in ihrem Modell ein oder mehrere TLObjects "eingepackt" hat, aber das Modell ist nicht einfach eine Collection von TLObjects, dann muss die Komponente extractTLObjects(model) überschreiben. Sonst werden diese TLObjects nicht gefunden, die Komponente wird nicht als Listener dafür registriert, bekommt keine Updates, aktualisiert sich nicht, und zeigt veraltete Daten an, wenn diese TLObjects geändert oder gelöscht werden.
- Soll eine Komponente nicht migriert werden, dann kann observeAllTypes() mit return true; überschrieben werden. Dann wird sie über alles informiert.
- Die folgenden Methoden von tl:LayoutComponent wurden deprecated:
- receiveModelCreatedEvent
- receiveModelChangedEvent
- receiveModelDeletedEvent
- Statt dessen die folgenden Methoden verwenden:
- handleTLObjectCreations
- handleTLObjectUpdates
- handleTLObjectDeletions
- notifyChange (Falls alle drei Arten von Events gleichartig behandelt werden sollen.)
- Die folgenden Konstanten in tl:ModelEventListener wurden deprecated:
- MODEL_MODIFIED
- MODEL_CREATED
- MODEL_DELETED
- tl:TableComponent, tl:TreeTableComponent und tl:GridComponent müssen korrekt konfiguriert haben, welche Typen sie enthalten. Sonst bekommen sie keine Modell Events mehr und aktualisieren sich nicht.
- Ableitungen von TreeModelBuilder und AbstractTreeGridBuilder müssen die Methode getTypesToObserve() überschreiben, wenn sie persistente Objekte in ihrem Baum verwenden.
- GridBuilder.receiveModelCreatedEvent(...) wurde durch handleTLObjectCreations(...) ersetzt
Weitere Umstellungen
- Wenn eine Klasse ModelEventAdapter.receiveAnyModelEvent(...) überschreibt, muss sie angepasst werden. Diese Methode wird nicht mehr für Model Created, Modified und Deleted aufgerufen. Wenn das aber benötigt wird, müssen die drei dazugehörigen Methoden überschrieben werden und dort receiveAnyModelEvent aufrufen.
- DynamicModelService.Config.getDefaultFactory() (also Property default-factory) wurde entfernt. Es wurde nicht mehr verwendet. Verwendungen in .config.xml Dateien müssen entfernt werden.
- Das Interface ModelEventReveiver (sic) wurde gelöscht.
- MainLayout.GlobalConfig.getEventForwarderClass() (also Property eventForwarderClass) wurde durch getEventForwarder() ersetzt.
- Die Klasse ModelEventForwarder wurde zu einem Interface. Außerdem wurden etliche Methoden entfernt.
- Es ist nicht mehr möglich zu erkennen, ob ein Event aus der eigenen Session kam. Wenn Event aus der eigenen Session besonders behandelt werden sollen, muss das Kommando, das diese Änderung verursacht, sich auch um diese Sonderbehandlung kümmern.
- ModelEventForwarder.SENDER_IN_OTHER_SESSION wurde gelöscht.
- ExpressionSelectorComponent.isFromOwnSession(...) wurde gelöscht.
- TreeTableComponent.getQualifiedTypeNames() wurde durch getTypes() ersetzt.
- Folgende Methoden wurden entfernt:
- MainLayout.doBroadcastModelEvent(LayoutComponent, Object, Object, int)
- TLMainLayout.broadcastEvent(Collection, Object, LayoutComponent, int)
- TLMainLayout.doBroadcastModelEvent(LayoutComponent, Object, Object, int)
- Die Klasse com.top_logic.layout.component.model.ModelChangeEvent wurde deprecated. Statt dessen soll com.top_logic.model.listen.ModelChangeEvent verwendet werden.
Test
- test.com.top_logic.mig.html.layout.TestGlobalModelEventForwarder