Ich erstelle Instanzen von dijit.layout.ContentPane
, dijit.layout.StackContainer
und dijit.layout.BorderContainer
von meinem JS-Code.
Anscheinend muss ich die Methode startup()
der programmatisch erzeugten Instanzen aufrufen.
Ich bin mir jedoch nicht sicher, ob ich es für jedes Widget aufrufen muss.
Zum Beispiel, wenn ich ein ' new my.foo.widget()
' mache, wird startup()
automatisch ausgelöst.
Danke, dass Sie mir geholfen haben zu verstehen, wann Sie die Methode startup()
aufrufen sollten!
startup () ist in _Widget definiert und ist einfach ein "Teil des Lebenszyklus". Dies ist der letzte Schritt im Widget-Lebenszyklus und wird nicht von allen Widgets benötigt. Der häufigste Fall, in dem dies unbedingt erforderlich ist, ist das programmatische Erstellen von Layout-Widgets. Es wird verwendet, um redundante Berechnungen zu verhindern, wenn die Größe der untergeordneten Elemente benötigt wird. Zum Beispiel ein BorderContainer.
%Vor%Bei parseOnLoad wird der Start automatisch vom Parser aufgerufen: true oder manual execution. Der Parser verzögert den Aufruf von startup (), bis alle gefundenen untergeordneten Widgets ordnungsgemäß instanziiert wurden.
dijit.Dialog ist ein seltsamer Fall. startup () muss auch auf diesem Widget aufgerufen werden.
%Vor%Die meisten Widgets müssen NICHT gestartet werden, aber in Fällen, in denen etwas, das von _Widget erbt, das Startelement nicht überschreibt, ist der Aufruf im Wesentlichen eine no-op Einstellung this._started = true; Wenn Sie Ihre eigene startup () - Funktion erstellen, sollten Sie entweder this.inherited (arguments) aufrufen oder den _started-Trigger einfach manuell setzen.
In Dojo 1.4 wurde der Lebenszyklus hier leicht angepasst. Zuvor wurde ein Widget mit widgetsInTemplate: true startup () für die untergeordneten Widgets VOR dem startup () des übergeordneten Elements aufrufen. In 1.4 wird das Startup () der Kinder nach dem Elternstart () aufgerufen. Dieses Verhalten ist rekursiv für viele Ebenen verschachtelter Widgets mit widgetsInTemplate: true wird instanziiert.
Es ist immer "sicher", .startup () aufzurufen. Wenn Sie jedoch "wissen" (weil es sich um ein einfaches Endpunkt-Widget oder Ihren eigenen benutzerdefinierten _Widget-Code handelt), können Sie den Aufruf weglassen.
Bist du sicher, dass es automatisch aufgerufen wird oder hast du Code in deinem Widget, der es aufruft?
Es ist eine gute Übung, es aufzurufen, da es _started
auf true
setzt, das von einigen Widgets zum Bestimmen von Verhalten und / oder Layout verwendet wird. Die meisten Widgets erfordern, dass Sie es aufrufen (wie Sie gesehen haben).
startup
wird stark von zusammengesetzten Widgets verwendet, die Subwidgets steuern müssen.
Grundsätzlich sollte alles, was von dijit._Widget
erbt, den Start nach der Instanziierung aufrufen.
EDITS:
Es gibt einen Artikel über SitePen über den Dijit-Lebenszyklus, der sich ein wenig mit dem Start beschäftigt im Artikel selbst und in den Kommentaren. Es ist jedoch über zwei Jahre alt und ich denke, die Dinge haben sich geändert.
Die O'Reilly Dojo Buch auch spricht über den Start, aber es heißt, es sollte Container Widgets aufgerufen werden. Ich musste es auf dem Raster nennen, aber das macht auch keinen Sinn.
Es tut nicht wirklich weh, wenn Sie es aufrufen (es sei denn, Sie rufen es an, bevor Kinder zu Ihrem Widget hinzugefügt werden). Ich würde sagen, es immer anrufen.
Für untergeordnete Widgets, die im Markup deklariert sind, wird diese Methode automatisch ausgelöst, sobald das Widget und alle untergeordneten Widgets erstellt wurden. Daher ist dies der erste sichere Ort, an dem ein Kind-Widget sicher auf ein Kind verweisen kann. So einfach es klingt, diese Aufgabe wird oft in postCreate versucht, was zu inkonsistentem Verhalten führen kann, das schwer zu erkennen und zu reparieren ist. Bei programmgesteuert erstellten Widgets, die andere untergeordnete Widgets als Teil einer has-a-Beziehung enthalten, müssen Sie das Startprogramm manuell aufrufen, wenn Sie sicher sind, dass alle untergeordneten Widgets erstellt wurden. Der Grund, dass Sie es für programmgesteuert erstellte Widgets, die untergeordnete Elemente enthalten, selbst aufrufen müssen, ist, dass es nicht sinnvoll wäre, mit der Größenanpassung und dem Rendern fortzufahren, wenn nicht alle untergeordneten Widgets hinzugefügt wurden. (Andernfalls kann es sehr viele falsche Starts geben.) Diese Methode ist der letzte Methodenstub, den Sie überschreiben können, damit das benutzerdefinierte Verhalten während der Dijit-Konstruktion auftritt.