|
525
|
1 |
/* |
|
|
2 |
YUI 3.10.3 (build 2fb5187) |
|
|
3 |
Copyright 2013 Yahoo! Inc. All rights reserved. |
|
|
4 |
Licensed under the BSD License. |
|
|
5 |
http://yuilibrary.com/license/ |
|
|
6 |
*/ |
|
|
7 |
|
|
|
8 |
YUI.add('view-node-map', function (Y, NAME) { |
|
|
9 |
|
|
|
10 |
/** |
|
|
11 |
View extension that adds a static `getByNode()` method that returns the nearest |
|
|
12 |
View instance associated with the given Node (similar to Widget's `getByNode()` |
|
|
13 |
method). |
|
|
14 |
|
|
|
15 |
@module app |
|
|
16 |
@submodule view-node-map |
|
|
17 |
@since 3.5.0 |
|
|
18 |
**/ |
|
|
19 |
|
|
|
20 |
var buildCfg = Y.namespace('View._buildCfg'), |
|
|
21 |
instances = {}; |
|
|
22 |
|
|
|
23 |
/** |
|
|
24 |
View extension that adds a static `getByNode()` method that returns the nearest |
|
|
25 |
View instance associated with the given Node (similar to Widget's `getByNode()` |
|
|
26 |
method). |
|
|
27 |
|
|
|
28 |
Note that it's important to call `destroy()` on a View instance using this |
|
|
29 |
extension when you plan to stop using it. This ensures that all internal |
|
|
30 |
references to that View are cleared to prevent memory leaks. |
|
|
31 |
|
|
|
32 |
@class View.NodeMap |
|
|
33 |
@extensionfor View |
|
|
34 |
@since 3.5.0 |
|
|
35 |
**/ |
|
|
36 |
function NodeMap() {} |
|
|
37 |
|
|
|
38 |
// Tells Base.create() to mix the static getByNode method into built classes. |
|
|
39 |
// We're cheating and modifying Y.View here, because right now there's no better |
|
|
40 |
// way to do it. |
|
|
41 |
buildCfg.aggregates || (buildCfg.aggregates = []); |
|
|
42 |
buildCfg.aggregates.push('getByNode'); |
|
|
43 |
|
|
|
44 |
/** |
|
|
45 |
Returns the nearest View instance associated with the given Node. The Node may |
|
|
46 |
be a View container or any child of a View container. |
|
|
47 |
|
|
|
48 |
Note that only instances of Views that have the Y.View.NodeMap extension mixed |
|
|
49 |
in will be returned. The base View class doesn't provide this functionality by |
|
|
50 |
default due to the additional memory management overhead involved in maintaining |
|
|
51 |
a mapping of Nodes to View instances. |
|
|
52 |
|
|
|
53 |
@method getByNode |
|
|
54 |
@param {Node|HTMLElement|String} node Node instance, selector string, or |
|
|
55 |
HTMLElement. |
|
|
56 |
@return {View} Closest View instance associated with the given Node, or `null` |
|
|
57 |
if no associated View instance was found. |
|
|
58 |
@static |
|
|
59 |
@since 3.5.0 |
|
|
60 |
**/ |
|
|
61 |
NodeMap.getByNode = function (node) { |
|
|
62 |
var view; |
|
|
63 |
|
|
|
64 |
Y.one(node).ancestor(function (ancestor) { |
|
|
65 |
return (view = instances[Y.stamp(ancestor, true)]) || false; |
|
|
66 |
}, true); |
|
|
67 |
|
|
|
68 |
return view || null; |
|
|
69 |
}; |
|
|
70 |
|
|
|
71 |
// To make this testable. |
|
|
72 |
NodeMap._instances = instances; |
|
|
73 |
|
|
|
74 |
NodeMap.prototype = { |
|
|
75 |
initializer: function () { |
|
|
76 |
instances[Y.stamp(this.get('container'))] = this; |
|
|
77 |
}, |
|
|
78 |
|
|
|
79 |
destructor: function () { |
|
|
80 |
var stamp = Y.stamp(this.get('container'), true); |
|
|
81 |
|
|
|
82 |
if (stamp in instances) { |
|
|
83 |
delete instances[stamp]; |
|
|
84 |
} |
|
|
85 |
} |
|
|
86 |
}; |
|
|
87 |
|
|
|
88 |
Y.View.NodeMap = NodeMap; |
|
|
89 |
|
|
|
90 |
|
|
|
91 |
}, '3.10.3', {"requires": ["view"]}); |