refactor(async): refactor EventEmitter

Refactor EventEmitter and Async Facade to match ES7 Observable semantics, properly use RxJS typedefs, make EventEmitter inherit from RxJS Subject. Closes #4149.

BREAKING CHANGE:
- consumers of EventEmitter no longer need to call .toRx()
- EventEmitter is now generic and requires a type - e.g. `EventEmitter<string>`
- EventEmitter and Observable now use the `.subscribe(generatorOrNext, error, complete)` method instead of `.observer(generator)`
- ObservableWrapper uses `callNext/callError/callComplete` instead of `callNext/callThrow/callReturn`
This commit is contained in:
Rob Wormald
2015-10-24 18:48:43 -07:00
parent 72e65d6797
commit ca3986f31d
35 changed files with 341 additions and 113 deletions

View File

@ -89,7 +89,7 @@ class ParentComp {
@Directive({selector: 'custom-emitter', outputs: ['myevent']})
@Injectable()
class CustomEmitter {
myevent: EventEmitter;
myevent: EventEmitter<any>;
constructor() { this.myevent = new EventEmitter(); }
}

View File

@ -16,7 +16,7 @@ import {ObservableWrapper, EventEmitter, PromiseWrapper} from 'angular2/src/core
export function main() {
describe('EventEmitter', () => {
var emitter: EventEmitter;
var emitter: EventEmitter<any>;
beforeEach(() => { emitter = new EventEmitter(); });
@ -34,18 +34,18 @@ export function main() {
expect(error).toEqual("Boom");
async.done();
});
ObservableWrapper.callThrow(emitter, "Boom");
ObservableWrapper.callError(emitter, "Boom");
}));
it("should work when no throw callback is provided", inject([AsyncTestCompleter], (async) => {
ObservableWrapper.subscribe(emitter, (_) => {}, (_) => { async.done(); });
ObservableWrapper.callThrow(emitter, "Boom");
ObservableWrapper.callError(emitter, "Boom");
}));
it("should call the return callback", inject([AsyncTestCompleter], (async) => {
ObservableWrapper.subscribe(emitter, (_) => {}, (_) => {}, () => { async.done(); });
ObservableWrapper.callReturn(emitter);
ObservableWrapper.callComplete(emitter);
}));
it("should subscribe to the wrapper asynchronously", () => {

View File

@ -907,7 +907,7 @@ class WrappedValue implements ControlValueAccessor {
@Component({selector: "my-input", template: ''})
class MyInput implements ControlValueAccessor {
@Output('change') onChange: EventEmitter = new EventEmitter();
@Output('change') onChange: EventEmitter<any> = new EventEmitter();
value: string;
constructor(cd: NgControl) { cd.valueAccessor = this; }

View File

@ -133,7 +133,7 @@ export function main() {
if (!IS_DART) {
it("should update set errors and status before emitting an event",
inject([AsyncTestCompleter], (async) => {
c.valueChanges.toRx().subscribe(value => {
c.valueChanges.subscribe(value => {
expect(c.valid).toEqual(false);
expect(c.errors).toEqual({"required": true});
async.done();

View File

@ -1976,7 +1976,7 @@ class DoublePipe implements PipeTransform {
@Injectable()
class DirectiveEmitingEvent {
msg: string;
event: EventEmitter;
event: EventEmitter<any>;
constructor() {
this.msg = '';
@ -2002,7 +2002,7 @@ class DirectiveUpdatingHostProperties {
@Directive({selector: '[update-host-actions]', host: {'@setAttr': 'setAttribute'}})
@Injectable()
class DirectiveUpdatingHostActions {
setAttr: EventEmitter;
setAttr: EventEmitter<any>;
constructor() { this.setAttr = new EventEmitter(); }