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:
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.
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%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).
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%Tags und Links knockout.js javascript knockout-components