dojo dijit.Dialog zerstören Unterlage Fehler
Ich habe eine Klasse, die Sie erweitert dijit.Dialog, sondern setzt lediglich Standard-Funktionen und buttons für meine Website. Beim klicken auf das Dialogfeld die Schaltfläche Abbrechen wird der folgende code ausgeführt:
this.actionDialog.destroyRecursive();
this.actionDialog.destroy();
nb this.actionDialog = dijit.Dialog
Manchmal (nicht immer) die folgende Fehlermeldung wird ausgegeben:
Uncaught TypeError: Cannot call method 'destroy' of undefined
DialogUnderlay.xd.js:8
Wodurch folgende Dialoge falsch angezeigt. Ich bin mit 1.5 von Google-API. Bin ich etwas fehlt mit der Unterlage-code?
Fehler geworfen, nachdem Ken ' s Antwort:
exception in animation handler for: onEnd
TypeError: Cannot read property 'style' of null
Sowohl aus dojo.xd.js:14
. Aber der code funktioniert immer noch einwandfrei.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bin ich mir noch nicht ganz sicher, was das problem ist, andere als aus irgendeinem Grund
dijit.DialogUnderlay
code ist immer verwirrt. FWIW, dies geschieht nicht im Dojo 1.6.Während ich Stossen auf einige mögliche Lösungen, ich kam durch Zufall heraus, dass die Vermeidung dieses Problems ist vielleicht so einfach wie das aufrufen
hide()
auf den dialog, bevor es zu zerstören, z.B.:Alternativ könnte Sie interessieren, im Versteck der dialog, dann, es zu zerstören, sobald Sie die ausblenden-animation abgeschlossen ist.
Hier ist, wie Sie es tun können, auf Dojo 1.5 und frühere Versionen (getestet mit 1.3+):
In 1.6, die fadeOut-animation nicht mehr ausgesetzt, die auf die Instanz (zugegeben, es war technisch private früher jedenfalls), aber
onHide
löst nun einmal die animation endet (während es vorher ausgelöst, sobald es anfing). Leider setTimeout nötig ist, um um einen Fehler, der Auftritt, aufgrund anderer code in der Niederlassung anrufenonHide
, die davon ausgeht, dass etwas existiert noch immer auf die Instanz, die nicht nach wir haben es zerstört (siehe #12436).Sehen Sie es in Aktion auf JSFiddle: http://jsfiddle.net/3MNRu/1/ (Siehe die erste version für den ursprünglichen Fehler in der Frage)
this.domNode.style
imonEnd
Rückruf der animation, aber das code sollte immer ausgeführt werden, bevor alle Funktionen, die Sie mit ihm verbunden sind. Ich nehme an, Sie könnten versuchen, diesetTimeout
trick auch auf der 1.5 nähern, um zu sehen, ob das hilft. Aus Neugier, welchen browser ist dies auf?Den dialog.hide() Methode gibt eine Latente, deinen code etwas lesbarer zu gestalten wie diese:
Vorsichtig sein, dies nicht zu tun:
Den Kontext der dann diese andere Bedeutung hat!
Müssen Sie nur nennen destroyRecursive()
Den zweiten zerstören-Befehl ist, was wahrscheinlich verursacht die Fehler, und der Fehler ist wahrscheinlich verursacht die Probleme mit anderen Dialogen.
http://dojotoolkit.org/api/1.3/dijit/_Widget/destroyRecursive
destroyRecursive
Zerstören dieses widget und es ist Nachkommen. Dies ist die generische "Destruktor" - Funktion, die alle widget-Benutzer anrufen soll, um sauber entsorgen mit einem widget. Sobald ein widget zerstört wird, wird es entfernt von der manager-Objekt.
destroyRecursive
nennen. jsfiddle.net/3MNRu (klicken Sie auf anzeigen, klicken Sie zerstören, klicken Sie auf anzeigen, klicken Sie zerstören, boom)War ich immer der IE8 Fehler :
'this.focusNode.form' is null or not an object
. Ich fand dies war das Ergebnis derdialog.hide()
Rückkehr eine latente. Ich schrieb meine eigenen_closeDialog
die eliminiert die IE-Fehler.