@@ -2,45 +2,73 @@ part of angular.core.dom;
2
2
3
3
typedef void EventFunction (event);
4
4
5
+ /**
6
+ * [EventHandler] is responsible for handling events bound using on-* syntax
7
+ * (i.e. `on-click="ctrl.doSomething();"` ). The root of the application has an
8
+ * EventHandler attached as does every [NgComponent] .
9
+ *
10
+ * Events bound within [NgComponent] are handled by EventHandler attached to
11
+ * their [ShadowRoot] . All other events are handled by EventHandler attached
12
+ * to the application root ([NgApp] ).
13
+ *
14
+ * **Note**: The expressions are executed within the closest context.
15
+ *
16
+ * Example:
17
+ *
18
+ * <div foo>
19
+ * <button on-click="ctrl.say('Hello');">Button</button>;
20
+ * </div>
21
+ *
22
+ * @NgComponent(selector: '[foo]', publishAs: ctrl)
23
+ * class FooController {
24
+ * say(String something) => print(something);
25
+ * }
26
+ *
27
+ * When button is clicked, "Hello" will be printed in the console.
28
+ */
5
29
@NgInjectableService ()
6
30
class EventHandler {
7
- dom.Node rootNode ;
8
- final Expando expando ;
9
- final ExceptionHandler exceptionHandler ;
10
- final listeners = < String , Function > {};
31
+ dom.Node _rootNode ;
32
+ final Expando _expando ;
33
+ final ExceptionHandler _exceptionHandler ;
34
+ final _listeners = < String , Function > {};
11
35
12
- EventHandler (this .rootNode , this .expando , this .exceptionHandler );
36
+ EventHandler (this ._rootNode , this ._expando , this ._exceptionHandler );
13
37
38
+ /**
39
+ * Register an event. This makes sure that an event (of the specified name)
40
+ * which bubbles to this node, gets processed by this [EventHandler] .
41
+ */
14
42
void register (String eventName) {
15
- listeners .putIfAbsent (eventName, () {
16
- dom.EventListener eventListener = this .eventListener ;
17
- rootNode .on [eventName].listen (eventListener);
43
+ _listeners .putIfAbsent (eventName, () {
44
+ dom.EventListener eventListener = this ._eventListener ;
45
+ _rootNode .on [eventName].listen (eventListener);
18
46
return eventListener;
19
47
});
20
48
}
21
49
22
- void eventListener (dom.Event event) {
50
+ void _eventListener (dom.Event event) {
23
51
dom.Node element = event.target;
24
- while (element != null && element != rootNode ) {
52
+ while (element != null && element != _rootNode ) {
25
53
var expression;
26
54
if (element is dom.Element )
27
55
expression = (element as dom.Element ).attributes[eventNameToAttrName (event.type)];
28
56
if (expression != null ) {
29
57
try {
30
- var scope = getScope (element);
58
+ var scope = _getScope (element);
31
59
if (scope != null ) scope.eval (expression);
32
60
} catch (e, s) {
33
- exceptionHandler (e, s);
61
+ _exceptionHandler (e, s);
34
62
}
35
63
}
36
64
element = element.parentNode;
37
65
}
38
66
}
39
67
40
- Scope getScope (dom.Node element) {
68
+ Scope _getScope (dom.Node element) {
41
69
// var topElement = (rootNode is dom.ShadowRoot) ? rootNode.parentNode : rootNode;
42
- while (element != rootNode .parentNode) {
43
- ElementProbe probe = expando [element];
70
+ while (element != _rootNode .parentNode) {
71
+ ElementProbe probe = _expando [element];
44
72
if (probe != null ) {
45
73
return probe.scope;
46
74
}
0 commit comments