summaryrefslogtreecommitdiff
path: root/lib/dijit/Destroyable.js.uncompressed.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/dijit/Destroyable.js.uncompressed.js')
-rw-r--r--lib/dijit/Destroyable.js.uncompressed.js59
1 files changed, 59 insertions, 0 deletions
diff --git a/lib/dijit/Destroyable.js.uncompressed.js b/lib/dijit/Destroyable.js.uncompressed.js
new file mode 100644
index 000000000..ee6b8893e
--- /dev/null
+++ b/lib/dijit/Destroyable.js.uncompressed.js
@@ -0,0 +1,59 @@
+define("dijit/Destroyable", [
+ "dojo/_base/array", // array.forEach array.map
+ "dojo/aspect",
+ "dojo/_base/declare"
+], function(array, aspect, declare){
+
+// module:
+// dijit/Destroyable
+
+return declare("dijit.Destroyable", null, {
+ // summary:
+ // Mixin to track handles and release them when instance is destroyed.
+ // description:
+ // Call this.own(...) on list of handles (returned from dojo/aspect, dojo/on,
+ // dojo/Stateful::watch, or any class (including widgets) with a destroyRecursive() or destroy() method.
+ // Then call destroy() later to destroy this instance and release the resources.
+
+ destroy: function(/*Boolean*/ preserveDom){
+ // summary:
+ // Destroy this class, releasing any resources registered via own().
+ this._destroyed = true;
+ },
+
+ own: function(){
+ // summary:
+ // Track specified handles and remove/destroy them when this instance is destroyed, unless they were
+ // already removed/destroyed manually.
+ // tags:
+ // protected
+ // returns:
+ // The array of specified handles, so you can do for example:
+ // | var handle = this.own(on(...))[0];
+
+ array.forEach(arguments, function(handle){
+ var destroyMethodName =
+ "destroyRecursive" in handle ? "destroyRecursive" : // remove "destroyRecursive" for 2.0
+ "destroy" in handle ? "destroy" :
+ "remove";
+
+ // When this.destroy() is called, destroy handle. Since I'm using aspect.before(),
+ // the handle will be destroyed before a subclass's destroy() method starts running, before it calls
+ // this.inherited() or even if it doesn't call this.inherited() at all. If that's an issue, make an
+ // onDestroy() method and connect to that instead.
+ var odh = aspect.before(this, "destroy", function(preserveDom){
+ handle[destroyMethodName](preserveDom);
+ });
+
+ // If handle is destroyed manually before this.destroy() is called, remove the listener set directly above.
+ var hdh = aspect.after(handle, destroyMethodName, function(){
+ odh.remove();
+ hdh.remove();
+ }, true);
+ }, this);
+
+ return arguments; // handle
+ }
+});
+
+});