KnockoutJS afterRender-Rückruf, wenn alle verschachtelten Komponenten gerendert wurden?

8

Ich habe eine Hierarchie von verschachtelten KnockoutJS-Komponenten mit 3.2.0. Es funktioniert sehr gut, aber ich möchte Code ausführen, nachdem meine gesamte Komponentenhierarchie geladen und gerendert wurde. Es ist ein ungefähres Äquivalent von afterRender (), das für die gleichen häufigen Anwendungsfälle wie afterRender benötigt wird.

Ich habe ein paar Versuche versucht, aber bisher kein Glück:

  1. Der Stammvorlage wurde Folgendes hinzugefügt, aber sie wird aufgerufen, bevor die verschachtelten Komponenten geladen werden, also zu früh. %Code%
  2. Verwenden der neuesten 3.3.0-Alpha und Angabe von sync: true für alle Komponenten. Aber ich glaube, seit ich AMD benutze, werden die Komponenten immer noch 'asynchron' geladen, was bedeutet, dass, nur weil mein root applyBindings () zurückkehrt, nicht bedeutet, dass alle Komponenten geladen und gerendert wurden.
  3. Es wurde sogar versucht, eine Sammlung verzögerter Objekte zu erstellen, die nur aufgelöst werden, wenn die entsprechenden Komponenten geladen werden. Dies wurde übermäßig kompliziert und funktionierte immer noch nicht aus Gründen, auf die ich nicht eingehen werde.

Gibt es eine Möglichkeit, einen Callback aufzurufen, sobald eine komplette Hierarchie von Knockoutjs-Komponenten geladen und gerendert wurde? Danke!

Ich bin gerade auf diese zwei Threads gestoßen, also scheint es, dass andere auch danach suchen. Das wichtigste Unterscheidungsmerkmal zu den vorhandenen Problemumgehungen ist, dass sie nicht mit verschachtelten Komponenten funktionieren.

Rich Taylor 26.11.2014, 19:27
quelle

3 Antworten

3

Ich habe eine Knockout-Bibliothek geschrieben, die ein Ereignis auslöst, wenn alle Komponenten geladen und gebunden wurden. Es wird Referenzzählung verwendet, ähnlich der Referenzzählung, die für die Garbage Collection verwendet wird. Ich verwende ausgiebig Komponenten in meinen Projekten, einschließlich der Verschachtelung vieler Ebenen, und ich kann nicht leben, ohne zu wissen, wann alles "bereit ist" zu gehen. Ich habe nicht viel Zeit mit der Dokumentation der Nutzung verbracht, aber die Grundlagen sind da.

Git Hub Wiki: Ссылка

Geige: Ссылка

Verwendung HTML:

%Vor%

Verwendung JS:

%Vor%     
raider33 23.02.2016 16:14
quelle
2

Hier ist, was für mich funktioniert hat. Ich habe es nicht in allen möglichen Variationen versucht, wie zum Beispiel das Mischen von Sync- und Async-Komponenten oder das Verwenden benutzerdefinierter Komponentenlader.

In KO 3.3.0 gibt es eine Methode, nach der alle Komponenten geladen werden:

ko.components = { get: function(componentName, callback) { ...

Die Methode get wird mit einer gewünschten componentName aufgerufen, und wenn die Komponente geladen wurde, wird ein callback aufgerufen.

Sie müssen also nur ko.components.get und callback umbrechen und pendingComponentsCount bei jedem Aufruf inkrementieren und dekrementieren, nachdem callback ausgeführt wurde. Wenn der Wert Null erreicht, bedeutet dies, dass alle Komponenten geladen wurden.

25 Zeilen des JS-Codes (mit Unterstreichungszeichen).

Sie müssen auch einen Sonderfall behandeln, in dem ko.applyBindings keine Komponenten gefunden hat, in denen auch alle Komponenten (alle davon null) geladen sind.

Nochmal, ich bin mir nicht sicher, ob das in jeder Situation funktioniert, aber es scheint in meinem Fall zu funktionieren. Ich kann mir einige Szenarien vorstellen, in denen dies leicht passieren kann (zum Beispiel, wenn jemand einen Verweis auf ko.components.get zwischenspeichert, bevor Sie ihn umbrechen).

    
THX-1138 01.04.2016 14:41
quelle
1

Wenn Sie mit ko.components arbeiten, kann das nützlich sein:

1) Erstellen Sie ein verzögertes Objekt, um den Überblick über das Laden jeder Komponente zu behalten

%Vor%

2) Informieren Sie knockout, um Ihnen mitzuteilen, wann die Komponente geladen und bereit ist

%Vor%

3) Synchronisieren Sie beide Statusabbrüche

%Vor%     
Frison Alexander 13.02.2015 14:09
quelle