Skip to content

Commit 7e99d94

Browse files
committed
feat(Events): allow a different local vs public name
closes angular#2272
1 parent e5419fe commit 7e99d94

File tree

3 files changed

+49
-4
lines changed

3 files changed

+49
-4
lines changed

modules/angular2/src/core/annotations_impl/annotations.ts

+21-1
Original file line numberDiff line numberDiff line change
@@ -550,7 +550,7 @@ export class Directive extends Injectable {
550550
* events: ['statusChange']
551551
* })
552552
* class TaskComponent {
553-
* statusChange:EventEmitter;
553+
* statusChange: EventEmitter;
554554
*
555555
* constructor() {
556556
* this.statusChange = new EventEmitter();
@@ -561,6 +561,26 @@ export class Directive extends Injectable {
561561
* }
562562
* }
563563
* ```
564+
*
565+
* Use `propertyName: eventName` when the event emitter property name is different from the name
566+
* of the emitted event:
567+
*
568+
* @Component({
569+
* events: ['status: statusChange']
570+
* })
571+
* class TaskComponent {
572+
* status: EventEmitter;
573+
*
574+
* constructor() {
575+
* this.status = new EventEmitter();
576+
* }
577+
*
578+
* onComplete() {
579+
* this.status.next('completed');
580+
* }
581+
* }
582+
* ```
583+
*
564584
*/
565585
events: List<string>;
566586

modules/angular2/src/core/compiler/element_injector.ts

+16-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import {
44
Type,
55
BaseException,
66
stringify,
7-
CONST_EXPR
7+
CONST_EXPR,
8+
StringWrapper
89
} from 'angular2/src/facade/lang';
910
import {EventEmitter, ObservableWrapper} from 'angular2/src/facade/async';
1011
import {List, ListWrapper, MapWrapper, StringMapWrapper} from 'angular2/src/facade/collection';
@@ -382,8 +383,20 @@ export class BindingData {
382383
createEventEmitterAccessors() {
383384
if (!(this.binding instanceof DirectiveBinding)) return [];
384385
var db = <DirectiveBinding>this.binding;
385-
return ListWrapper.map(db.eventEmitters, eventName => new EventEmitterAccessor(
386-
eventName, reflector.getter(eventName)));
386+
return ListWrapper.map(db.eventEmitters, eventConfig => {
387+
let fieldName;
388+
let eventName;
389+
var colonIdx = eventConfig.indexOf(':');
390+
if (colonIdx > -1) {
391+
// long format: 'fieldName: eventName'
392+
fieldName = StringWrapper.substring(eventConfig, 0, colonIdx).trim();
393+
eventName = StringWrapper.substring(eventConfig, colonIdx + 1).trim();
394+
} else {
395+
// short format: 'name' when fieldName and eventName are the same
396+
fieldName = eventName = eventConfig;
397+
}
398+
return new EventEmitterAccessor(eventName, reflector.getter(fieldName))
399+
});
387400
}
388401

389402
createHostActionAccessors() {

modules/angular2/test/core/compiler/element_injector_spec.ts

+12
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,18 @@ export function main() {
418418
expect(accessor.getter(new HasEventEmitter())).toEqual('emitter');
419419
});
420420

421+
it('should allow a different internal vs public name', () => {
422+
var binding = DirectiveBinding.createFromType(HasEventEmitter,
423+
new dirAnn.Directive({events: ['emitter: publicEmitter']}));
424+
425+
var inj = createPei(null, 0, [binding]);
426+
expect(inj.eventEmitterAccessors.length).toEqual(1);
427+
428+
var accessor = inj.eventEmitterAccessors[0][0];
429+
expect(accessor.eventName).toEqual('publicEmitter');
430+
expect(accessor.getter(new HasEventEmitter())).toEqual('emitter');
431+
});
432+
421433
it('should return a list of hostAction accessors', () => {
422434
var binding = DirectiveBinding.createFromType(
423435
HasEventEmitter, new dirAnn.Directive({hostActions: {'hostActionName': 'onAction'}}));

0 commit comments

Comments
 (0)