Zum Inhalt springen
Anjunar/ DOCS

Rendern und Hydration

Ember hat keinen eigenen Renderer. DocumentView projiziert das Dokument auf den scalajs-ui-Komponentenbaum, auf dem Server in HTML und im Browser auf die ausgelieferte Seite.

Ansicht

Eine geschlüsselte Projektion

Jeder Container bekommt nach NodeId geschlüsselte Kinder. Ein unveränderter Knoten wird nicht angefasst, und Tippen schreibt genau eine characterData-Mutation.

scala
val view = DocumentView.mount(session, cursor, TableSupport.views, parent = Some(host)) view.projectedRevision // what is shown right now view.onProjected(revision => ...) // after each projection view.dispose()
Server

Derselbe Aufruf, ein anderer Cursor

In einer serverseitig gerenderten Seite mountest du die Ansicht wie gewohnt unter dem Cursor der Seite. Für Ausgabe ohne Seite nimmt renderToHtml ein Document, keine Sitzung: keine Auswahl, keine Historie, kein Fokus.

scala
DocumentView.mount(session, Runtime.contentCursor(host), TableSupport.views, parent = Some(host)) if cursor.isBrowser then val element = DomNodes.raw(host.host).asInstanceOf[dom.HTMLElement] val selection = SelectionPort.detached(session, view, element) val input = BrowserInputController.detached(session, view, selection, EditorBindings.everything, EditorBindings.everythingKeyboard, TabPolicy.LeavesEditor, EditorMode.Editable, None, BusyPolicy.Defer) cursor.afterHydration { () => selection.attach() input.attach() }

Die Live-Editoren auf diesen Seiten sind genau so gebaut: mit der Seite gerendert und angebunden, nachdem die Hydration das Markup übernommen hat.

Aktivierung

Editierbar erst, wenn es sicher ist

Vor der ersten Übernahme hält die Hydration fest, was der Nutzer vielleicht schon getippt hat. Bearbeiten beginnt erst, wenn die Seite hydriert ist und keine Eingabesitzung laufen kann.

Active
Editierbar.
Deferred(PageHydrating)
Die Seite um den Editor hydriert noch.
Deferred(InputSession)
Eine Eingabesitzung ist offen oder könnte es sein.
Deferred(UnimportedSource)
Der Quelltext hat sich seit dem Rendern geändert.
Failed
Die lokale Übernahme ist gescheitert; es kommt nichts mehr.