mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2026-03-13 10:22:08 +08:00
refactor(deep-linking): fix url when navigating back to url w/ params
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
112
src/components/nav/test/nav.spec.ts
Normal file
112
src/components/nav/test/nav.spec.ts
Normal 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;
|
||||
}
|
||||
@@ -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];
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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', () => {
|
||||
|
||||
Reference in New Issue
Block a user