refactor(deep-linking): fix url when navigating back to url w/ params

This commit is contained in:
Dan Bucholtz
2017-03-14 16:08:11 -05:00
parent 0ae638a6a0
commit d93ca82666
4 changed files with 143 additions and 19 deletions

View File

@@ -111,15 +111,15 @@ export class Nav extends NavControllerBase implements AfterViewInit, RootNode {
this._hasInit = true;
let navSegment = this._linker.initNav(this);
if (navSegment && navSegment.component) {
if (navSegment && (navSegment.component || navSegment.loadChildren)) {
// there is a segment match in the linker
this._linker.initViews(navSegment).then(views => {
return this._linker.initViews(navSegment).then(views => {
this.setPages(views, null, null);
});
} else if (this._root) {
// no segment match, so use the root property
this.push(this._root, this.rootParams, {
return this.push(this._root, this.rootParams, {
isNavRoot: (<any>this._app.getRootNav() === this)
}, null);
}

View File

@@ -0,0 +1,112 @@
import { Nav } from '../nav';
import { GestureController } from '../../../gestures/gesture-controller';
import { Keyboard } from '../../../platform/keyboard';
import {
mockApp,
mockConfig,
mockDeepLinker,
mockDomController,
mockElementRef,
mockPlatform,
mockRenderer,
mockTrasitionController,
mockZone,
} from '../../../util/mock-providers';
describe('Nav', () => {
describe('ngAfterViewInit', () => {
it('should call initViews when segment has a component', (done: Function) => {
const nav = getNav();
const knownComponent = {};
const knownSegment = {
component: knownComponent
};
const knownViews = {};
spyOn(nav._linker, 'initNav').and.returnValue(knownSegment);
spyOn(nav._linker, 'initViews').and.returnValue(Promise.resolve(knownViews));
spyOn(nav, 'setPages');
const promise = nav.ngAfterViewInit();
promise.then(() => {
expect(nav._linker.initViews).toHaveBeenCalledWith(knownSegment);
expect(nav.setPages).toHaveBeenCalledWith(knownViews, null, null);
done();
}).catch((err: Error) => {
done(err);
});
});
it('should call initViews when segment has a loadChildren string', (done: Function) => {
const nav = getNav();
const knownLoadChildren = 'someString';
const knownSegment = {
loadChildren: knownLoadChildren
};
const knownViews = {};
spyOn(nav._linker, 'initNav').and.returnValue(knownSegment);
spyOn(nav._linker, 'initViews').and.returnValue(Promise.resolve(knownViews));
spyOn(nav, 'setPages');
const promise = nav.ngAfterViewInit();
promise.then(() => {
expect(nav._linker.initViews).toHaveBeenCalledWith(knownSegment);
expect(nav.setPages).toHaveBeenCalledWith(knownViews, null, null);
done();
}).catch((err: Error) => {
done(err);
});
});
it('should call push when root is set', (done: Function) => {
const nav = getNav();
const knownComponent = {};
nav.root = knownComponent;
spyOn(nav, 'push').and.returnValue(Promise.resolve());
const promise = nav.ngAfterViewInit();
promise.then(() => {
expect(nav.push).toHaveBeenCalled();
done();
}).catch((err: Error) => {
done(err);
});
});
});
});
function getNav() {
const platform = mockPlatform();
const config = mockConfig(null, '/', platform);
const app = mockApp(config, platform);
const zone = mockZone();
const dom = mockDomController(platform);
const keyboard = new Keyboard(config, platform, zone, dom);
const elementRef = mockElementRef();
const renderer = mockRenderer();
const componentFactoryResolver: any = null;
const gestureCtrl = new GestureController(app);
const linker = mockDeepLinker(null, app);
const trnsCtrl = mockTrasitionController(config);
const nav = new Nav(
null,
null,
app,
config,
platform,
keyboard,
elementRef,
zone,
renderer,
componentFactoryResolver,
gestureCtrl,
trnsCtrl,
linker,
dom
);
return nav;
}

View File

@@ -2,7 +2,7 @@ import { ComponentFactory, ComponentFactoryResolver } from '@angular/core';
import { Location } from '@angular/common';
import { App } from '../components/app/app';
import { convertToViews, isNav, isTab, isTabs, NavLink, NavSegment, DIRECTION_BACK } from './nav-util';
import { convertToViews, DIRECTION_BACK, isNav, isTab, isTabs, NavLink, NavSegment } from './nav-util';
import { ModuleLoader } from '../util/module-loader';
import { isArray, isPresent } from '../util/util';
import { Nav } from '../components/nav/nav';
@@ -594,17 +594,21 @@ export class DeepLinker {
* @internal
*/
initViews(segment: NavSegment) {
const view = new ViewController(segment.component, segment.data);
view.id = segment.id;
const link = this._serializer.getLinkFromName(segment.name);
return this.getNavLinkComponent(link).then((component: any) => {
segment.component = component;
const view = new ViewController(component, segment.data);
view.id = segment.id;
if (isArray(segment.defaultHistory)) {
return convertToViews(this, segment.defaultHistory).then(views => {
views.push(view);
return views;
});
}
if (isArray(segment.defaultHistory)) {
return convertToViews(this, segment.defaultHistory).then(views => {
views.push(view);
return views;
});
}
return Promise.resolve([view]);
return [view];
});
}
/**

View File

@@ -271,14 +271,22 @@ describe('DeepLinker', () => {
describe('initViews', () => {
it('should create the ViewController for just the segment', () => {
// let segment = serializer.parse('/viewone')[0];
it('should return an array with one view controller when there isnt default history', (done: Function) => {
const knownSegment = {
id: 'idk',
name: 'viewone',
data: {}
};
const promise = linker.initViews(knownSegment);
// let views = linker.initViews(segment);
// expect(views[0].component).toEqual(segment.component);
// expect(views[0].id).toEqual('VIEWID');
promise.then((result: any[]) => {
expect(Array.isArray(result)).toBeTruthy();
expect(result.length).toEqual(1);
done();
}).catch((err: Error) => {
done(err);
});
});
});
describe('initNav', () => {