| OLD | NEW |
| (Empty) | |
| 1 part of angular.directive; |
| 2 |
| 3 // NOTE(deboer): onXX functions are now typed as 'var' instead of 'Getter' |
| 4 // to work-around https://code.google.com/p/dart/issues/detail?id=13519 |
| 5 |
| 6 /** |
| 7 * Allows you to specify custom behavior for DOM UI events such as mouse, |
| 8 * keyboard and touch events. |
| 9 * |
| 10 * The custom behavior is specified via an Angular binding expression specified |
| 11 * on the `ng-`*event* directive (e.g. `ng-click`). This expression is evaluate
d |
| 12 * on the correct `scope` every time the event occurs. The event is available |
| 13 * to the expression as `$event`. |
| 14 * |
| 15 * This is more secure than inline DOM handlers in HTML that execute arbitrary |
| 16 * JavaScript code and have access to globals instead of the scope without the |
| 17 * safety constraints of the Angular expression language. |
| 18 * |
| 19 * Example: |
| 20 * |
| 21 * <button ng-click="lastEvent='Click'" |
| 22 * ng-doubleclick="lastEvent='DblClick'"> |
| 23 * Button |
| 24 * </button> |
| 25 * |
| 26 * The full list of supported handlers are: |
| 27 * |
| 28 * - [ng-blur] |
| 29 * - [ng-change] |
| 30 * - [ng-click] |
| 31 * - [ng-contextmenu] |
| 32 * - [ng-doubleclick] |
| 33 * - [ng-drag] |
| 34 * - [ng-dragend] |
| 35 * - [ng-dragenter] |
| 36 * - [ng-dragleave] |
| 37 * - [ng-dragover] |
| 38 * - [ng-dragstart] |
| 39 * - [ng-drop] |
| 40 * - [ng-focus] |
| 41 * - [ng-keydown] |
| 42 * - [ng-keypress] |
| 43 * - [ng-keyup] |
| 44 * - [ng-mousedown] |
| 45 * - [ng-mouseenter] |
| 46 * - [ng-mouseleave] |
| 47 * - [ng-mousemove] |
| 48 * - [ng-mouseout] |
| 49 * - [ng-mouseover] |
| 50 * - [ng-mouseup] |
| 51 * - [ng-mousewheel] |
| 52 * - [ng-scroll] |
| 53 * - [ng-submit] |
| 54 * - [ng-touchcancel] |
| 55 * - [ng-touchend] |
| 56 * - [ng-touchmove] |
| 57 * - [ng-touchstart] |
| 58 */ |
| 59 @NgDirective(selector: '[ng-blur]', map: const {'ng-blur': '&onBlu
r'}) |
| 60 @NgDirective(selector: '[ng-change]', map: const {'ng-change': '&onCha
nge'}) |
| 61 @NgDirective(selector: '[ng-click]', map: const {'ng-click': '&onCli
ck'}) |
| 62 @NgDirective(selector: '[ng-contextmenu]', map: const {'ng-contextmenu': '&onCon
textMenu'}) |
| 63 @NgDirective(selector: '[ng-doubleclick]', map: const {'ng-doubleclick': '&onDou
bleClick'}) |
| 64 @NgDirective(selector: '[ng-drag]', map: const {'ng-drag': '&onDra
g'}) |
| 65 @NgDirective(selector: '[ng-dragend]', map: const {'ng-dragend': '&onDra
gEnd'}) |
| 66 @NgDirective(selector: '[ng-dragenter]', map: const {'ng-dragenter': '&onDra
gEnter'}) |
| 67 @NgDirective(selector: '[ng-dragleave]', map: const {'ng-dragleave': '&onDra
gLeave'}) |
| 68 @NgDirective(selector: '[ng-dragover]', map: const {'ng-dragover': '&onDra
gOver'}) |
| 69 @NgDirective(selector: '[ng-dragstart]', map: const {'ng-dragstart': '&onDra
gStart'}) |
| 70 @NgDirective(selector: '[ng-drop]', map: const {'ng-drop': '&onDro
p'}) |
| 71 @NgDirective(selector: '[ng-focus]', map: const {'ng-focus': '&onFoc
us'}) |
| 72 @NgDirective(selector: '[ng-keydown]', map: const {'ng-keydown': '&onKey
Down'}) |
| 73 @NgDirective(selector: '[ng-keypress]', map: const {'ng-keypress': '&onKey
Press'}) |
| 74 @NgDirective(selector: '[ng-keyup]', map: const {'ng-keyup': '&onKey
Up'}) |
| 75 @NgDirective(selector: '[ng-mousedown]', map: const {'ng-mousedown': '&onMou
seDown'}) |
| 76 @NgDirective(selector: '[ng-mouseenter]', map: const {'ng-mouseenter': '&onMou
seEnter'}) |
| 77 @NgDirective(selector: '[ng-mouseleave]', map: const {'ng-mouseleave': '&onMou
seLeave'}) |
| 78 @NgDirective(selector: '[ng-mousemove]', map: const {'ng-mousemove': '&onMou
seMove'}) |
| 79 @NgDirective(selector: '[ng-mouseout]', map: const {'ng-mouseout': '&onMou
seOut'}) |
| 80 @NgDirective(selector: '[ng-mouseover]', map: const {'ng-mouseover': '&onMou
seOver'}) |
| 81 @NgDirective(selector: '[ng-mouseup]', map: const {'ng-mouseup': '&onMou
seUp'}) |
| 82 @NgDirective(selector: '[ng-mousewheel]', map: const {'ng-mousewheel': '&onMou
seWheel'}) |
| 83 @NgDirective(selector: '[ng-scroll]', map: const {'ng-scroll': '&onScr
oll'}) |
| 84 @NgDirective(selector: '[ng-submit]', map: const {'ng-submit': '&onSub
mit'}) |
| 85 @NgDirective(selector: '[ng-touchcancel]', map: const {'ng-touchcancel': '&onTou
chCancel'}) |
| 86 @NgDirective(selector: '[ng-touchend]', map: const {'ng-touchend': '&onTou
chEnd'}) |
| 87 @NgDirective(selector: '[ng-touchmove]', map: const {'ng-touchmove': '&onTou
chMove'}) |
| 88 @NgDirective(selector: '[ng-touchstart]', map: const {'ng-touchstart': '&onTou
chStart'}) |
| 89 class NgEventDirective { |
| 90 |
| 91 // NOTE: Do not use the element.on['some_event'].listen(...) syntax. Doing so |
| 92 // has two downsides: |
| 93 // - it loses the event typing |
| 94 // - some DOM events may have multiple platform-dependent event names |
| 95 // under the covers. The standard Stream getters you will get the |
| 96 // platform specific event name automatically but you're on your own if |
| 97 // you use the on[] syntax. This also applies to $dom_addEventListener. |
| 98 // Ref: http://api.dartlang.org/docs/releases/latest/dart_html/Events.html |
| 99 initListener(var stream, var handler) { |
| 100 int key = stream.hashCode; |
| 101 if (!listeners.containsKey(key)) { |
| 102 listeners[key] = handler; |
| 103 stream.listen((event) => scope.$apply(() { |
| 104 handler({r"$event": event}); |
| 105 })); |
| 106 } |
| 107 } |
| 108 |
| 109 set onBlur(value) => initListener(element.onBlur, value); |
| 110 set onChange(value) => initListener(element.onChange, value); |
| 111 set onClick(value) => initListener(element.onClick, value); |
| 112 set onContextMenu(value) => initListener(element.onContextMenu, value); |
| 113 set onDoubleClick(value) => initListener(element.onDoubleClick, value); |
| 114 set onDrag(value) => initListener(element.onDrag, value); |
| 115 set onDragEnd(value) => initListener(element.onDragEnd, value); |
| 116 set onDragEnter(value) => initListener(element.onDragEnter, value); |
| 117 set onDragLeave(value) => initListener(element.onDragLeave, value); |
| 118 set onDragOver(value) => initListener(element.onDragOver, value); |
| 119 set onDragStart(value) => initListener(element.onDragStart, value); |
| 120 set onDrop(value) => initListener(element.onDrop, value); |
| 121 set onFocus(value) => initListener(element.onFocus, value); |
| 122 set onKeyDown(value) => initListener(element.onKeyDown, value); |
| 123 set onKeyPress(value) => initListener(element.onKeyPress, value); |
| 124 set onKeyUp(value) => initListener(element.onKeyUp, value); |
| 125 set onMouseDown(value) => initListener(element.onMouseDown, value); |
| 126 set onMouseEnter(value) => initListener(element.onMouseEnter, value); |
| 127 set onMouseLeave(value) => initListener(element.onMouseLeave, value); |
| 128 set onMouseMove(value) => initListener(element.onMouseMove, value); |
| 129 set onMouseOut(value) => initListener(element.onMouseOut, value); |
| 130 set onMouseOver(value) => initListener(element.onMouseOver, value); |
| 131 set onMouseUp(value) => initListener(element.onMouseUp, value); |
| 132 set onMouseWheel(value) => initListener(element.onMouseWheel, value); |
| 133 set onScroll(value) => initListener(element.onScroll, value); |
| 134 set onSubmit(value) => initListener(element.onSubmit, value); |
| 135 set onTouchCancel(value) => initListener(element.onTouchCancel, value); |
| 136 set onTouchEnd(value) => initListener(element.onTouchEnd, value); |
| 137 set onTouchMove(value) => initListener(element.onTouchMove, value); |
| 138 set onTouchStart(value) => initListener(element.onTouchStart, value); |
| 139 |
| 140 // Is it better to use a map of listeners or have 29 properties on this |
| 141 // object? One would pretty much only assign to one or two of those |
| 142 // properties. I'm opting for the map since it's less boilerplate code. |
| 143 var listeners = {}; |
| 144 dom.Element element; |
| 145 Scope scope; |
| 146 |
| 147 NgEventDirective(this.element, this.scope); |
| 148 } |
| OLD | NEW |