Was steuert die Ausführungsreihenfolge für die JS-Komponenten von Themes?

Ich habe JavaScript in meinem Theme (bin ich schon berüchtigt? ;)), das den DOM verändert, indem es Elemente über api.decorateCooked(… hinzufügt. Es fügt verschiedene HTML-Head-Elemente ein.

Außerdem habe ich die DiscoTOC-Themenkomponente installiert.

Das Hinzufügen des üblichen <div data-theme-toc="true"></div>, das DiscoTOC erkennt und erweitert, generiert jedoch keine Inhaltsübersicht, die meine dynamisch eingefügten Elemente enthält.

Ich vermute, dass dies so einfach sein könnte wie die Ausführungsreihenfolge … wenn DiscoTOC sucht, bevor mein JavaScript weitere Elemente hinzufügt . . .

Was bestimmt die Ausführungsreihenfolge, wenn mehrere Teile des Theme-JavaScript-Codes api.cooked( aufrufen?

3 „Gefällt mir“

Bump? :slight_smile:

plus Unsinn, um auf 20 Zeichen zu kommen

Hinweis: DiscoTOC wird nur im Inhalt von Beiträgen ausgeführt. Wenn Sie diese Elemente außerhalb von Beiträgen einfügen, erkennt DiscoTOC sie nicht.

Ich glaube nicht, dass wir bisher die Ausführungsreihenfolge von JavaScript definieren mussten.

1 „Gefällt mir“

Ich füge es innerhalb des Beitrags ein, ja. Deshalb vermute ich eine Reihenfolge der Ausführung.

Ein Stück Code bestimmt die Ausführungsreihenfolge… das ist der Ansatzpunkt für mich, um meine Komponente vor dem Inhaltsverzeichnis zu platzieren. Wenn es beispielsweise alphabetisch nach Komponentennamen sortiert ist (also so, wie sie in der Komponentensliste im Verwaltungsbereich angezeigt wird), kann ich versuchen, meine Komponente entsprechend zu benennen, usw.

Ich bin mir ziemlich sicher, dass die Ausführungsreihenfolge von Komponenten nicht vom Namen der Komponente abhängt. Standardmäßig basiert sie auf der ID.

Das heißt, du kannst die Reihenfolge der Initialisierer für fortgeschrittene Anwendungsfälle festlegen. Ich kann DiscoTOC in einen benannten Initialisierer einfügen, damit du deinen Code vor DiscoTOC ausführen kannst. Ich muss jedoch erst wissen, was du genau vor hast, um dir eine klare Antwort geben zu können.

Deine Änderungen hier basieren auf einer HTTP/AJAX-Anfrage, richtig?

1 „Gefällt mir“

Ja, AJAX, aber mit einem synchronen Aufruf. (Ich habe das Oxymoron des synchronen AJAX immer geliebt :^)

Ich habe das Gefühl, dass mein nächster Schritt darin besteht, eine ordentliche Komponente zu erstellen – im Moment ist es nur ein Stück J/S, das in den Header meines Themes eingefügt wurde. Dann kann ich versuchen, mit einer sorgfältig gewählten ID zu experimentieren. „_foo

1 „Gefällt mir“

Finden wir nicht alle alle :wink:

Richtig. Wenn du benannte Initialisierer und die Reihenfolge der Initialisierung verwenden möchtest, muss deine Komponente einen Initialisierer im Ordner /javascript haben.

Aber keine Sorge, ich kann dir dabei helfen. Ich melde mich morgen mit einer vollständigen Antwort bei dir.

1 „Gefällt mir“

Vor einiger Zeit habe ich mein J/S-Hacking in eine richtige Theme-Komponente umgewandelt.

Ich würde gerne darauf zurückkommen, die Reihenfolge so zu gestalten, dass meine Komponente vor dem Discourse-Inhaltsverzeichnis ausgeführt wird.

Soweit ich mich erinnere, werden Theme Components nach Plugins ausgewertet.

Und ich kann mich irren, aber sie werden in alphabetischer Reihenfolge geladen, daher hat es mir in der Vergangenheit geholfen, ein x- vor den Namen zu setzen, um sicherzustellen, dass eine bestimmte Theme Component zuletzt ausgewertet wird.

Das ist in Ordnung. Ich versuche, die Reihenfolge der DiscoTOC-Komponente ( https://github.com/discourse/DiscoTOC.git ) und einer von mir erstellten Komponente zu steuern.

Antworten anderer oben deuten darauf hin, dass der Name der Komponente die Ausführungsreihenfolge nicht beeinflusst. Ich habe sie gerade in aa-mycomponent und x-last-DiscoTOC umbenannt und es funktioniert nicht. [DiscoTOC schließt keine dynamisch zur DOM hinzugefügten Überschriften ein – ja, innerhalb des Beitragsrumpfes]

https://forum.moversmindset.com/t/list-of-movers-mindset-podcast-episodes/1160

@Johani, weitere Ideen aus deiner Gedankenspirale vom Mai?

hmmmmmmm… vielleicht ist das Problem größer als die Reihenfolge. Ich habe gerade „Inspizieren“ aufgerufen… und die Elemente im DOM, die ich für HTML-Überschriften hielt… sind tatsächlich DIV-Tags mit class=\"d-toc-ignore\".

Zeit für mich, tiefer zu graben. Wo sind meine Überschriften hin? :slight_smile:

Nun, ich denke, Sie könnten das beweisen, indem Sie ein sehr einfaches Beispiel ausprobieren.

Erstellen Sie zwei einfache Komponenten, die dasselbe überschreiben oder verbinden, vielleicht eine einfache Vorlage mit einem geringfügigen Unterschied, nennen Sie eine mit einem Namen, der später im Alphabet beginnt, und notieren Sie, welche das Thema überschreibt.

Es ist hier im Code des Modells eindeutig nach Namen geordnet:

1 „Gefällt mir“

Der Name hat keinen Einfluss auf die Ausführungsreihenfolge. @merefield die Zeile, auf die Sie verwiesen haben, beeinflusst, wie sie in der Admin-Oberfläche angezeigt werden, wird aber nicht für die eigentliche Ausführung verwendet.

Dies ist die relevante Zeile für die Ausführungsreihenfolge:

Sie werden also in aufsteigender Reihenfolge der „id“ in der Datenbank ausgeführt.

Die einzige Garantie, die über Discourse-Instanzen hinweg portierbar ist, ist, dass Theme-Code immer vor Theme Component-Code ausgeführt wird.

Wie @Johani oben erwähnt hat, ist die beste Vorgehensweise, wenn Sie Code ausführen müssen, nachdem eine andere Komponente geladen wurde, wahrscheinlich die Verwendung eines Ember-Initialisierers, der die Reihenfolge unterstützt. Leider ist dies in diesem Fall nicht sofort möglich, da DiscoTOC anscheinend keine Ember-Initialisierer verwendet. Ein Update von DiscoTOC zur Verwendung von JavaScript mit mehreren Dateien (und damit Ember-Initialisierern) wäre sicherlich ein pr-welcome.

3 „Gefällt mir“

Das ist bedauerlich, da es nützlich sein könnte. Danke für die Klärung auf jeden Fall!

1 „Gefällt mir“

(…und das steht im Zusammenhang mit Theme component order of precedence)

Ich wollte nur zurückmelden, dass die Reihenfolge der Priorität der DB-IDs funktioniert; löst mein Problem. Danke an alle!

2 „Gefällt mir“