X Tutup
Skip to content

Commit 855cb16

Browse files
committed
refactor(event_manager): use multi bindings to configure EventManager
Closes angular#3978
1 parent 5ebeaf7 commit 855cb16

File tree

8 files changed

+64
-48
lines changed

8 files changed

+64
-48
lines changed

modules/angular2/src/core/application_common.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,11 @@ import {NgZone} from 'angular2/src/core/zone/ng_zone';
3939
import {LifeCycle} from 'angular2/src/core/life_cycle/life_cycle';
4040
import {XHR} from 'angular2/src/core/render/xhr';
4141
import {XHRImpl} from 'angular2/src/core/render/xhr_impl';
42-
import {EventManager, DomEventsPlugin} from 'angular2/src/core/render/dom/events/event_manager';
42+
import {
43+
EventManager,
44+
DomEventsPlugin,
45+
EVENT_MANAGER_PLUGINS
46+
} from 'angular2/src/core/render/dom/events/event_manager';
4347
import {KeyEventsPlugin} from 'angular2/src/core/render/dom/events/key_events';
4448
import {HammerGesturesPlugin} from 'angular2/src/core/render/dom/events/hammer_gestures';
4549
import {ComponentUrlMapper} from 'angular2/src/core/compiler/component_url_mapper';
@@ -111,14 +115,10 @@ function _injectorBindings(appComponentType): Array<Type | Binding | any[]> {
111115
.toFactory((p: Promise<any>) => p.then(ref => ref.instance), [APP_COMPONENT_REF_PROMISE]),
112116
bind(LifeCycle).toFactory((exceptionHandler) => new LifeCycle(null, assertionsEnabled()),
113117
[ExceptionHandler]),
114-
bind(EventManager)
115-
.toFactory(
116-
(ngZone) => {
117-
var plugins =
118-
[new HammerGesturesPlugin(), new KeyEventsPlugin(), new DomEventsPlugin()];
119-
return new EventManager(plugins, ngZone);
120-
},
121-
[NgZone]),
118+
EventManager,
119+
new Binding(EVENT_MANAGER_PLUGINS, {toClass: DomEventsPlugin, multi: true}),
120+
new Binding(EVENT_MANAGER_PLUGINS, {toClass: KeyEventsPlugin, multi: true}),
121+
new Binding(EVENT_MANAGER_PLUGINS, {toClass: HammerGesturesPlugin, multi: true}),
122122
DomRenderer,
123123
bind(Renderer).toAlias(DomRenderer),
124124
APP_ID_RANDOM_BINDING,

modules/angular2/src/core/render/dom/events/event_manager.ts

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,25 @@
1-
import {isBlank, BaseException, isPresent, StringWrapper} from 'angular2/src/core/facade/lang';
1+
import {
2+
isBlank,
3+
BaseException,
4+
isPresent,
5+
StringWrapper,
6+
CONST_EXPR
7+
} from 'angular2/src/core/facade/lang';
8+
import {ListWrapper} from 'angular2/src/core/facade/collection';
29
import {DOM} from 'angular2/src/core/dom/dom_adapter';
310
import {NgZone} from 'angular2/src/core/zone/ng_zone';
11+
import {Injectable, Inject, OpaqueToken} from 'angular2/di';
412

13+
export const EVENT_MANAGER_PLUGINS: OpaqueToken =
14+
CONST_EXPR(new OpaqueToken("EventManagerPlugins"));
15+
16+
@Injectable()
517
export class EventManager {
6-
constructor(public _plugins: EventManagerPlugin[], public _zone: NgZone) {
7-
for (var i = 0; i < _plugins.length; i++) {
8-
_plugins[i].manager = this;
9-
}
18+
private _plugins: EventManagerPlugin[];
19+
20+
constructor(@Inject(EVENT_MANAGER_PLUGINS) plugins: EventManagerPlugin[], private _zone: NgZone) {
21+
plugins.forEach(p => p.manager = this);
22+
this._plugins = ListWrapper.reversed(plugins);
1023
}
1124

1225
addEventListener(element: HTMLElement, eventName: string, handler: Function) {
@@ -48,6 +61,7 @@ export class EventManagerPlugin {
4861
}
4962
}
5063

64+
@Injectable()
5165
export class DomEventsPlugin extends EventManagerPlugin {
5266
manager: EventManager;
5367

@@ -56,16 +70,16 @@ export class DomEventsPlugin extends EventManagerPlugin {
5670
supports(eventName: string): boolean { return true; }
5771

5872
addEventListener(element: HTMLElement, eventName: string, handler: Function) {
59-
var zone = this.manager._zone;
73+
var zone = this.manager.getZone();
6074
var outsideHandler = (event) => zone.run(() => handler(event));
61-
this.manager._zone.runOutsideAngular(() => { DOM.on(element, eventName, outsideHandler); });
75+
this.manager.getZone().runOutsideAngular(() => { DOM.on(element, eventName, outsideHandler); });
6276
}
6377

6478
addGlobalEventListener(target: string, eventName: string, handler: Function): Function {
6579
var element = DOM.getGlobalEventTarget(target);
66-
var zone = this.manager._zone;
80+
var zone = this.manager.getZone();
6781
var outsideHandler = (event) => zone.run(() => handler(event));
68-
return this.manager._zone.runOutsideAngular(
82+
return this.manager.getZone().runOutsideAngular(
6983
() => { return DOM.onAndCancel(element, eventName, outsideHandler); });
7084
}
7185
}

modules/angular2/src/core/render/dom/events/hammer_gestures.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ library angular.events;
33
import 'dart:html';
44
import './hammer_common.dart';
55
import 'package:angular2/src/core/facade/lang.dart' show BaseException;
6+
import "package:angular2/di.dart" show Injectable;
67

78
import 'dart:js' as js;
89

10+
@Injectable()
911
class HammerGesturesPlugin extends HammerGesturesPluginCommon {
1012
bool supports(String eventName) {
1113
if (!super.supports(eventName)) return false;

modules/angular2/src/core/render/dom/events/hammer_gestures.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
import {HammerGesturesPluginCommon} from './hammer_common';
44
import {isPresent, BaseException} from 'angular2/src/core/facade/lang';
5+
import {Injectable} from 'angular2/di';
56

7+
@Injectable()
68
export class HammerGesturesPlugin extends HammerGesturesPluginCommon {
7-
constructor() { super(); }
8-
99
supports(eventName: string): boolean {
1010
if (!super.supports(eventName)) return false;
1111

modules/angular2/src/core/render/dom/events/key_events.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
import {StringMapWrapper, ListWrapper} from 'angular2/src/core/facade/collection';
1111
import {EventManagerPlugin} from './event_manager';
1212
import {NgZone} from 'angular2/src/core/zone/ng_zone';
13+
import {Injectable} from 'angular2/di';
1314

1415
var modifierKeys = ['alt', 'control', 'meta', 'shift'];
1516
var modifierKeyGetters: StringMap<string, Function> = {
@@ -19,6 +20,7 @@ var modifierKeyGetters: StringMap<string, Function> = {
1920
'shift': (event) => event.shiftKey
2021
};
2122

23+
@Injectable()
2224
export class KeyEventsPlugin extends EventManagerPlugin {
2325
constructor() { super(); }
2426

modules/angular2/src/test_lib/test_injector.ts

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,11 @@ import {NgZone} from 'angular2/src/core/zone/ng_zone';
3030

3131
import {DOM} from 'angular2/src/core/dom/dom_adapter';
3232

33-
import {EventManager, DomEventsPlugin} from 'angular2/src/core/render/dom/events/event_manager';
33+
import {
34+
EventManager,
35+
DomEventsPlugin,
36+
EVENT_MANAGER_PLUGINS
37+
} from 'angular2/src/core/render/dom/events/event_manager';
3438

3539
import {MockViewResolver} from 'angular2/src/mock/view_resolver_mock';
3640
import {MockXHR} from 'angular2/src/core/render/xhr_mock';
@@ -144,15 +148,8 @@ function _getAppBindings() {
144148
StyleInliner,
145149
TestComponentBuilder,
146150
bind(NgZone).toClass(MockNgZone),
147-
bind(EventManager)
148-
.toFactory(
149-
(zone) => {
150-
var plugins = [
151-
new DomEventsPlugin(),
152-
];
153-
return new EventManager(plugins, zone);
154-
},
155-
[NgZone]),
151+
EventManager,
152+
new Binding(EVENT_MANAGER_PLUGINS, {toClass: DomEventsPlugin, multi: true})
156153
];
157154
}
158155

modules/angular2/src/web_workers/ui/di_bindings.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,11 @@ import {
1111
PreGeneratedChangeDetection
1212
} from 'angular2/src/core/change_detection/change_detection';
1313
import {DEFAULT_PIPES} from 'angular2/pipes';
14-
import {EventManager, DomEventsPlugin} from 'angular2/src/core/render/dom/events/event_manager';
14+
import {
15+
EventManager,
16+
DomEventsPlugin,
17+
EVENT_MANAGER_PLUGINS
18+
} from 'angular2/src/core/render/dom/events/event_manager';
1519
import {Compiler, CompilerCache} from 'angular2/src/core/compiler/compiler';
1620
import {BrowserDomAdapter} from 'angular2/src/core/dom/browser_adapter';
1721
import {KeyEventsPlugin} from 'angular2/src/core/render/dom/events/key_events';
@@ -87,14 +91,10 @@ function _injectorBindings(): any[] {
8791
return [
8892
bind(DOCUMENT)
8993
.toValue(DOM.defaultDoc()),
90-
bind(EventManager)
91-
.toFactory(
92-
(ngZone) => {
93-
var plugins =
94-
[new HammerGesturesPlugin(), new KeyEventsPlugin(), new DomEventsPlugin()];
95-
return new EventManager(plugins, ngZone);
96-
},
97-
[NgZone]),
94+
EventManager,
95+
new Binding(EVENT_MANAGER_PLUGINS, {toClass: DomEventsPlugin, multi: true}),
96+
new Binding(EVENT_MANAGER_PLUGINS, {toClass: KeyEventsPlugin, multi: true}),
97+
new Binding(EVENT_MANAGER_PLUGINS, {toClass: HammerGesturesPlugin, multi: true}),
9898
DomRenderer,
9999
bind(Renderer).toAlias(DomRenderer),
100100
APP_ID_RANDOM_BINDING,

modules/angular2/test/core/render/dom/events/event_manager_spec.ts

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,22 +25,23 @@ export function main() {
2525

2626
describe('EventManager', () => {
2727

28-
it('should delegate event bindings to plugins', () => {
29-
var element = el('<div></div>');
30-
var handler = (e) => e;
31-
var plugin = new FakeEventManagerPlugin(['click']);
32-
var manager = new EventManager([plugin, domEventPlugin], new FakeNgZone());
33-
manager.addEventListener(element, 'click', handler);
34-
expect(plugin._eventHandler.get('click')).toBe(handler);
35-
});
28+
it('should delegate event bindings to plugins that are passed in from the most generic one to the most specific one',
29+
() => {
30+
var element = el('<div></div>');
31+
var handler = (e) => e;
32+
var plugin = new FakeEventManagerPlugin(['click']);
33+
var manager = new EventManager([domEventPlugin, plugin], new FakeNgZone());
34+
manager.addEventListener(element, 'click', handler);
35+
expect(plugin._eventHandler.get('click')).toBe(handler);
36+
});
3637

3738
it('should delegate event bindings to the first plugin supporting the event', () => {
3839
var element = el('<div></div>');
3940
var clickHandler = (e) => e;
4041
var dblClickHandler = (e) => e;
4142
var plugin1 = new FakeEventManagerPlugin(['dblclick']);
4243
var plugin2 = new FakeEventManagerPlugin(['click', 'dblclick']);
43-
var manager = new EventManager([plugin1, plugin2], new FakeNgZone());
44+
var manager = new EventManager([plugin2, plugin1], new FakeNgZone());
4445
manager.addEventListener(element, 'click', clickHandler);
4546
manager.addEventListener(element, 'dblclick', dblClickHandler);
4647
expect(plugin1._eventHandler.has('click')).toBe(false);

0 commit comments

Comments
 (0)
X Tutup