Project:
Dojo Toolkit
Code Location:
http://svn.dojotoolkit.org/src/dijit/trunk//dijit/trunk
/
Outline
-
>
Fn
?(array,aspect,declare)
-
O
? {}
- M destroy(preserveDom)
-
M
own()
-
Fn
?(handle)
- V destroyMethodName
- Fn ?(preserveDom)
- V odh
- Fn ?()
- V hdh
-
Fn
?(handle)
-
O
? {}
Destroyable.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
define([ "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 } }); });
