Skip to content

Commit

Permalink
fix(Router): do not kill event-emitter on navigation failure
Browse files Browse the repository at this point in the history
Closes #7692
Closes #7532

Closes #7692
  • Loading branch information
petebacondarwin authored and mhevery committed May 23, 2016
1 parent ce013a3 commit cbeeff2
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 5 deletions.
10 changes: 7 additions & 3 deletions modules/@angular/router-deprecated/src/router.ts
Expand Up @@ -276,17 +276,21 @@ export class Router {
if (result) {
return this.commit(instruction, _skipLocationChange)
.then((_) => {
this._emitNavigationFinish(instruction.toRootUrl());
this._emitNavigationFinish(instruction.component);
return true;
});
}
});
});
}

private _emitNavigationFinish(url): void { ObservableWrapper.callEmit(this._subject, url); }
private _emitNavigationFinish(instruction: ComponentInstruction): void {
ObservableWrapper.callEmit(this._subject, {status: 'success', instruction});
}
/** @internal */
_emitNavigationFail(url): void { ObservableWrapper.callError(this._subject, url); }
_emitNavigationFail(url: string): void {
ObservableWrapper.callEmit(this._subject, {status: 'fail', url});
}

private _afterPromiseFinishNavigating(promise: Promise<any>): Promise<any> {
return PromiseWrapper.catchError(promise.then((_) => this._finishNavigating()), (err) => {
Expand Down
21 changes: 19 additions & 2 deletions modules/@angular/router-deprecated/test/router_spec.ts
Expand Up @@ -135,14 +135,31 @@ export function main() {
}));


it('should trigger the onError callback of a router change subscription if the URL does not match a route',
it('should pass an object containing the component instruction to the router change subscription after a successful navigation',
inject([AsyncTestCompleter], (async) => {
var outlet = makeDummyOutlet();

router.registerPrimaryOutlet(outlet)
.then((_) => router.config([new Route({path: '/a', component: DummyComponent})]))
.then((_) => {
router.subscribe((_) => {}, (url) => {
router.subscribe(({status, instruction}) => {
expect(status).toEqual('success');
expect(instruction).toEqual(jasmine.objectContaining({urlPath: 'a', urlParams: []}));
async.done();
});
(<SpyLocation>location).simulateHashChange('a');
});
}));

it('should pass an object containing the bad url to the router change subscription after a failed navigation',
inject([AsyncTestCompleter], (async) => {
var outlet = makeDummyOutlet();

router.registerPrimaryOutlet(outlet)
.then((_) => router.config([new Route({path: '/a', component: DummyComponent})]))
.then((_) => {
router.subscribe(({status, url}) => {
expect(status).toEqual('fail');
expect(url).toEqual('b');
async.done();
});
Expand Down

0 comments on commit cbeeff2

Please sign in to comment.