Navigation Menu

Skip to content

Commit

Permalink
fix(angular): ion-nav no routing
Browse files Browse the repository at this point in the history
  • Loading branch information
manucorporat committed Mar 20, 2018
1 parent f39d3ad commit 9094c66
Show file tree
Hide file tree
Showing 13 changed files with 318 additions and 58 deletions.
46 changes: 12 additions & 34 deletions angular/src/navigation/ion-nav.ts
@@ -1,7 +1,6 @@
import { ComponentFactoryResolver, Directive, ElementRef, Injector} from '@angular/core';
import { NavigationEnd, NavigationStart, Router } from '@angular/router';

import { FrameworkDelegate, NavOptions, NavParams, TransitionDoneFn, ViewController } from '@ionic/core';
import { NavOptions, NavParams, TransitionDoneFn, ViewController } from '@ionic/core';
import { proxyEl } from '../util/util';
import { AngularDelegate } from '..';

Expand All @@ -11,70 +10,57 @@ import { AngularDelegate } from '..';
})
export class IonNav {

private delegate: FrameworkDelegate;

constructor(
private ref: ElementRef,
router: Router,
cfr: ComponentFactoryResolver,
injector: Injector,
angularDelegate: AngularDelegate,
) {
this.delegate = angularDelegate.create(cfr, injector);
console.log('ion-nav');

router.events.subscribe(ev => {
if (ev instanceof NavigationStart) {
console.log('NavigationStart', ev.url);

} else if (ev instanceof NavigationEnd) {
console.log('NavigationEnd', ev.url);
}
});
this.ref.nativeElement.delegate = angularDelegate.create(cfr, injector);
}

push(page: any, params?: NavParams, opts?: NavOptions, done?: TransitionDoneFn): Promise<boolean> {
return proxyEl(this.ref, 'push', page, params, this.wrap(opts), done);
return proxyEl(this.ref, 'push', page, params, opts, done);
}

insert(insertIndex: number, page: any, params?: NavParams, opts?: NavOptions, done?: TransitionDoneFn): Promise<boolean> {
return proxyEl(this.ref, 'insert', insertIndex, page, params, this.wrap(opts), done);
return proxyEl(this.ref, 'insert', insertIndex, page, params, opts, done);
}

insertPages(insertIndex: number, insertPages: any[], opts?: NavOptions, done?: TransitionDoneFn): Promise<boolean> {
return proxyEl(this.ref, 'insertPages', insertIndex, insertPages, this.wrap(opts), done);
return proxyEl(this.ref, 'insertPages', insertIndex, insertPages, opts, done);
}

pop(opts?: NavOptions, done?: TransitionDoneFn): Promise<boolean> {
return proxyEl(this.ref, 'pop', this.wrap(opts), done);
return proxyEl(this.ref, 'pop', opts, done);
}

popTo(indexOrViewCtrl: any, opts?: NavOptions, done?: TransitionDoneFn): Promise<boolean> {
return proxyEl(this.ref, 'popTo', indexOrViewCtrl, this.wrap(opts), done);
return proxyEl(this.ref, 'popTo', indexOrViewCtrl, opts, done);
}

popToRoot(opts?: NavOptions, done?: TransitionDoneFn): Promise<boolean> {
return proxyEl(this.ref, 'popToRoot', this.wrap(opts), done);
return proxyEl(this.ref, 'popToRoot', opts, done);
}

popAll(): Promise<boolean[]> {
return proxyEl(this.ref, 'popAll');
}

removeIndex(startIndex: number, removeCount = 1, opts?: NavOptions, done?: TransitionDoneFn): Promise<boolean> {
return proxyEl(this.ref, 'removeIndex', startIndex, removeCount, this.wrap(opts), done);
return proxyEl(this.ref, 'removeIndex', startIndex, removeCount, opts, done);
}

removeView(viewController: ViewController, opts?: NavOptions, done?: TransitionDoneFn): Promise<boolean> {
return proxyEl(this.ref, 'removeView', viewController, this.wrap(opts), done);
return proxyEl(this.ref, 'removeView', viewController, opts, done);
}

setRoot(pageOrViewCtrl: any, params?: any, opts?: NavOptions, done?: TransitionDoneFn): Promise<boolean> {
return proxyEl(this.ref, 'setRoot', pageOrViewCtrl, params, this.wrap(opts), done);
return proxyEl(this.ref, 'setRoot', pageOrViewCtrl, params, opts, done);
}

setPages(pages: any[], opts?: NavOptions, done?: TransitionDoneFn): Promise<boolean> {
return proxyEl(this.ref, 'setPages', pages, this.wrap(opts), done);
return proxyEl(this.ref, 'setPages', pages, opts, done);
}

getAllChildNavs(): any[] {
Expand Down Expand Up @@ -114,12 +100,4 @@ export class IonNav {
length() {
return proxyEl(this.ref, 'length');
}

private wrap(opts?: NavOptions): NavOptions {
return {
...this.wrap(opts),
delegate: this.delegate
};
}

}
6 changes: 3 additions & 3 deletions angular/src/providers/angular-delegate.ts
Expand Up @@ -53,9 +53,9 @@ export class AngularFrameworkDelegate implements FrameworkDelegate {
}

removeViewFromDom(_container: any, component: any): Promise<void> {
const mountingData = this.elRefMap.get(component);
if (mountingData) {
mountingData.componentRef.destroy();
const componentRef = this.elRefMap.get(component);
if (componentRef) {
componentRef.destroy();
this.elRefMap.delete(component);
}
return Promise.resolve();
Expand Down
4 changes: 4 additions & 0 deletions core/src/components.d.ts
Expand Up @@ -42,6 +42,9 @@ import {
import {
Side,
} from './utils/helpers';
import {
FrameworkDelegate as FrameworkDelegate2,
} from '.';
import {
PickerButton,
PickerColumn as PickerColumn2,
Expand Down Expand Up @@ -2010,6 +2013,7 @@ declare global {
namespace JSXElements {
export interface IonNavAttributes extends HTMLAttributes {
animated?: boolean;
delegate?: FrameworkDelegate;
root?: any;
rootParams?: any;
swipeBackEnabled?: boolean;
Expand Down
40 changes: 21 additions & 19 deletions core/src/components/nav/nav.tsx
Expand Up @@ -12,7 +12,7 @@ import {
} from './nav-util';

import { ViewController, isViewController } from './view-controller';
import { Animation, Config, DomController, GestureDetail, NavOutlet } from '../..';
import { Animation, Config, DomController, FrameworkDelegate, GestureDetail, NavOutlet } from '../..';
import { RouteID, RouteWrite } from '../router/utils/interfaces';
import { assert } from '../../utils/helpers';

Expand Down Expand Up @@ -51,6 +51,7 @@ export class NavControllerBase implements NavOutlet {
@Prop({ connect: 'ion-animation-controller' }) animationCtrl: HTMLIonAnimationControllerElement;
@Prop({ mutable: true }) swipeBackEnabled: boolean;
@Prop({ mutable: true }) animated: boolean;
@Prop() delegate: FrameworkDelegate;
@Prop() rootParams: any;
@Prop() root: any;
@Watch('root')
Expand Down Expand Up @@ -342,16 +343,11 @@ export class NavControllerBase implements NavOutlet {
}
this._init = true;

// ensure we're not transitioning here
this.isTransitioning = false;
// let's see if there's another to kick off
this._nextTrns();
const isPop = result.direction === NavDirection.back;
if (this.useRouter) {
const router = document.querySelector('ion-router');
router && router.navChanged(isPop);
}

this.ionNavChanged.emit({isPop});

if (ti.done) {
Expand All @@ -372,11 +368,6 @@ export class NavControllerBase implements NavOutlet {
return;
}
this._queue.length = 0;

// let's see if there's another to kick off
this.isTransitioning = false;
this._nextTrns();

this._fireError(rejectReason, ti);
}

Expand Down Expand Up @@ -405,11 +396,16 @@ export class NavControllerBase implements NavOutlet {
return false;
}

// set that this nav is actively transitioning
this.isTransitioning = true;
this.runTransition(ti);
return true;
}

private async runTransition(ti: TransitionInstruction) {
try {
// set that this nav is actively transitioning
this.isTransitioning = true;
this._prepareTI(ti);

const leavingView = this.getActive();
const enteringView = this._getEnteringView(ti, leavingView);

Expand All @@ -421,23 +417,28 @@ export class NavControllerBase implements NavOutlet {
ti.requiresTransition = (ti.enteringRequiresTransition || ti.leavingRequiresTransition) && enteringView !== leavingView;

if (enteringView && enteringView._state === ViewState.New) {
enteringView.init(this.el);
await enteringView.init(this.el);
}
this._postViewInit(enteringView, leavingView, ti);

this._transition(enteringView, leavingView, ti)
.then((result) => this._success(result, ti))
.catch((rejectReason) => this._failed(rejectReason, ti));
const result = await this._transition(enteringView, leavingView, ti);

this._success(result, ti);
} catch (rejectReason) {
this._failed(rejectReason, ti);
}
return true;
this.isTransitioning = false;
this._nextTrns();
}

private _prepareTI(ti: TransitionInstruction) {
const viewsLength = this._views.length;

ti.opts = ti.opts || {};

if (ti.opts.delegate === undefined) {
ti.opts.delegate = this.delegate;
}
if (ti.removeView != null) {
assert(isPresent(ti.removeStart), 'removeView needs removeStart');
assert(isPresent(ti.removeCount), 'removeView needs removeCount');
Expand Down Expand Up @@ -481,6 +482,7 @@ export class NavControllerBase implements NavOutlet {
// Check all the inserted view are correct
for (let i = 0; i < viewControllers.length; i++) {
const view = viewControllers[i];
view.delegate = ti.opts.delegate;
const nav = view._nav;
if (nav && nav !== this) {
throw new Error('inserted view was already inserted');
Expand Down Expand Up @@ -519,7 +521,7 @@ export class NavControllerBase implements NavOutlet {
assert(ti.resolve, 'resolve must be valid');
assert(ti.reject, 'reject must be valid');

const opts = ti.opts = ti.opts || {};
const opts = ti.opts;
const insertViews = ti.insertViews;
const removeStart = ti.removeStart;
const removeCount = ti.removeCount;
Expand Down
10 changes: 10 additions & 0 deletions core/src/components/nav/readme.md
Expand Up @@ -12,6 +12,11 @@
boolean


#### delegate




#### root

any
Expand All @@ -34,6 +39,11 @@ boolean
boolean


#### delegate




#### root

any
Expand Down
4 changes: 2 additions & 2 deletions core/src/components/nav/view-controller.ts
Expand Up @@ -32,11 +32,11 @@ export class ViewController {
/** @hidden */
id: string;
element: HTMLElement;
delegate: FrameworkDelegate;

constructor(
public component: any,
public data: any,
private delegate?: FrameworkDelegate,
public data: any
) {}

/**
Expand Down
3 changes: 3 additions & 0 deletions demos/angular/src/app/app-routing.module.ts
Expand Up @@ -19,6 +19,9 @@ const routes: Routes = [
{ path: 'popover', loadChildren: 'app/popover/popover.module#PopoverModule' },
{ path: 'segment', loadChildren: 'app/segment/segment.module#SegmentModule' },
{ path: 'virtual-scroll', loadChildren: 'app/virtual-scroll/virtual-scroll.module#VirtualScrollModule' },

{ path: 'no-routing-nav', loadChildren: 'app/no-routing-nav/no-routing-nav.module#NoRoutingNavModule' },

];

@NgModule({
Expand Down
@@ -0,0 +1,14 @@
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';

import { NoRoutingNavPageComponent } from './no-routing-nav.component';

const routes: Routes = [
{ path: '', component: NoRoutingNavPageComponent }
];

@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class NoRoutingNavRoutingModule { }
20 changes: 20 additions & 0 deletions demos/angular/src/app/no-routing-nav/no-routing-nav.component.ts
@@ -0,0 +1,20 @@
import { Component } from '@angular/core';

import { PageOne } from './pages/page-one';

@Component({
selector: 'app-nav-page',
template: `
<ion-app>
<ion-nav [root]="pageOne"></ion-nav>
</ion-app>
`
})
export class NoRoutingNavPageComponent {

pageOne: any = PageOne;
constructor() {

}

}
31 changes: 31 additions & 0 deletions demos/angular/src/app/no-routing-nav/no-routing-nav.module.ts
@@ -0,0 +1,31 @@
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { CommonModule } from '@angular/common';

import { NoRoutingNavPageComponent } from './no-routing-nav.component';
import { NoRoutingNavRoutingModule } from './no-routing-nav-routing.module';
import { IonicAngularModule } from '@ionic/angular';

import { PageOne } from './pages/page-one';
import { PageTwo } from './pages/page-two';
import { PageThree } from './pages/page-three';

@NgModule({
imports: [
CommonModule,
NoRoutingNavRoutingModule,
IonicAngularModule,
],
declarations: [
NoRoutingNavPageComponent,
PageOne,
PageTwo,
PageThree
],
entryComponents: [
PageOne,
PageTwo,
PageThree
],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
export class NoRoutingNavModule { }

0 comments on commit 9094c66

Please sign in to comment.