enhancement
major
minor
defect
critical
major
minor
major
#30165
React: Ein Befehl mit „ignoreStaleUi“ an ein Steuerelement, das nicht mehr auf dem Bildschirm angezeigt wird, schlägt weiterhin mit dem Fehler 404 „Steuerelement nicht gefunden“ fehl.
Problem
Das Verlassen einer Seite mit einem <chat-conversation> -Element führt zur Löschung des zugehörigen Steuerelements; die Methode ChatStream.close() des Chats sendet daraufhin detachStream mit CommandOptions.ignoreStaleUi (#30126). ReactServlet.answerMissingControl antwortet nur dann mit dem Code ERROR_CODE_STALE_UI, wenn das Fenster überhaupt keine Steuerelemente enthält; bei einem einzigen Steuerelement, das die Anzeige verlassen hat, antwortet es mit einem einfachen 404-Fehler „Control not found: vNN“ ohne Code, und command-channel.ts protokolliert dies als fehlgeschlagenen Befehl ([TLReact] Befehl fehlgeschlagen: 404 …).
Reproduziert in tl-factory (Gitea TopLogic/tl-factory #39): Anmelden, Seite mit einem Chat starten, auf ein anderes Seitenleistenelement klicken: {"controlId":"v64","command":"detachStream",…} → 404.
Änderung
Die Antworten für ein fehlendes Steuerelement (answerMissingControl, ebenso der Pfad nach Modellereignissen) enthalten einen eigenen Fehlercode; ein mit ` ignoreStaleUi` gesendeter Befehl ignoriert diesen stillschweigend, ähnlich wie der Code für veraltete Benutzeroberflächen. Dokumentiert unter „CommandOptions.ignoreStaleUi “ und im Artikel „view-layer/client-server-protocol“.
Test
Unit-Testfür „command-channel “: 404 mit diesem Code und „ignoreStaleUi“ → kein Fehler, kein „console.error“. ReactServlet: Ein Befehl an ein entferntes Steuerelement eines Fensters, das noch Steuerelemente enthält, liefert mit diesem Code den Status 404.
Lösung
- ReactServlet.ERROR_CODE_CONTROL_GONE (control-gone, abgebildet in command-channel.ts): Jeder 404-Fehler „Steuerelement nicht gefunden“ eines Fensters, das noch Steuerelemente enthält, führt dazu – ein Befehl nach „answerMissingControl“, ein Befehl, dessen Steuerelement die Anzeige verlassen hat, während das Fenster mit dem Modell synchronisiert wurde, die Statusabfrage eines Steuerelements, ein Upload, dessen Steuerelement die Anzeige verlassen hat. Ein Helper sendet diese Antwort. Ein Fenster ohne Steuerelemente antwortet weiterhin mit „stale-ui“ (der Client lädt die Seite neu).
- command-channel.ts: „control-gone“ mit „CommandOptions.ignoreStaleUi“ wird stillschweigend verworfen; ohne diese Option wird es wie bisher als fehlgeschlagener Befehl protokolliert, ohne die Seite neu zu laden (die Seite ist weiterhin gültig, nur ihr Ziel ist nicht mehr vorhanden). Die Option behält ihren Namen: Beide Codes bedeuten, dass die Benutzeroberfläche, von der aus der Befehl gesendet wurde, veraltet ist.
- Dokumentiert unter CommandOptions.ignoreStaleUi und in view-layer/client-server-protocol.
- Tests: vitest von command-channel (control-gone mit und ohne ignoreStaleUi) sowie ein Servlet-Test für einen Befehl an ein entferntes Steuerelement eines Fensters, das noch über Steuerelemente verfügt.