chore(angular): update to angular 2.0.0-beta.16

This commit is contained in:
Adam Bradley
2016-04-28 23:12:56 -05:00
parent 49e1b20342
commit e6a673bd32
9 changed files with 130 additions and 112 deletions

View File

@ -1,4 +1,4 @@
import {Compiler, ElementRef, Injector, provide, NgZone, AppViewManager, Renderer, ResolvedProvider, Type, Input} from 'angular2/core'; import {ViewContainerRef, DynamicComponentLoader, provide, ReflectiveInjector, ResolvedReflectiveProvider, ElementRef, NgZone, Renderer, Type} from 'angular2/core';
import {wtfLeave, wtfCreateScope, WtfScopeFn, wtfStartTimeRange, wtfEndTimeRange} from 'angular2/instrumentation'; import {wtfLeave, wtfCreateScope, WtfScopeFn, wtfStartTimeRange, wtfEndTimeRange} from 'angular2/instrumentation';
import {Config} from '../../config/config'; import {Config} from '../../config/config';
@ -7,7 +7,7 @@ import {IonicApp} from '../app/app';
import {Keyboard} from '../../util/keyboard'; import {Keyboard} from '../../util/keyboard';
import {NavParams} from './nav-params'; import {NavParams} from './nav-params';
import {pascalCaseToDashCase, isBlank} from '../../util/util'; import {pascalCaseToDashCase, isBlank} from '../../util/util';
import {Portal} from './nav-portal'; import {NavPortal} from './nav-portal';
import {SwipeBackGesture} from './swipe-back'; import {SwipeBackGesture} from './swipe-back';
import {Transition} from '../../transitions/transition'; import {Transition} from '../../transitions/transition';
import {ViewController} from './view-controller'; import {ViewController} from './view-controller';
@ -147,7 +147,8 @@ export class NavController extends Ion {
private _trans: Transition; private _trans: Transition;
private _sbGesture: SwipeBackGesture; private _sbGesture: SwipeBackGesture;
private _sbThreshold: number; private _sbThreshold: number;
private _portal: Portal; private _portal: NavPortal;
private _viewport: ViewContainerRef;
private _children: any[] = []; private _children: any[] = [];
protected _sbEnabled: boolean; protected _sbEnabled: boolean;
@ -164,7 +165,7 @@ export class NavController extends Ion {
/** /**
* @private * @private
*/ */
providers: ResolvedProvider[]; providers: ResolvedReflectiveProvider[];
/** /**
* @private * @private
@ -192,11 +193,9 @@ export class NavController extends Ion {
config: Config, config: Config,
protected _keyboard: Keyboard, protected _keyboard: Keyboard,
elementRef: ElementRef, elementRef: ElementRef,
protected _anchorName: string,
protected _compiler: Compiler,
protected _viewManager: AppViewManager,
protected _zone: NgZone, protected _zone: NgZone,
protected _renderer: Renderer protected _renderer: Renderer,
protected _loader: DynamicComponentLoader
) { ) {
super(elementRef); super(elementRef);
@ -211,7 +210,7 @@ export class NavController extends Ion {
this.id = (++ctrlIds).toString(); this.id = (++ctrlIds).toString();
// build a new injector for child ViewControllers to use // build a new injector for child ViewControllers to use
this.providers = Injector.resolve([ this.providers = ReflectiveInjector.resolve([
provide(NavController, {useValue: this}) provide(NavController, {useValue: this})
]); ]);
} }
@ -219,10 +218,17 @@ export class NavController extends Ion {
/** /**
* @private * @private
*/ */
setPortal(val: Portal) { setPortal(val: NavPortal) {
this._portal = val; this._portal = val;
} }
/**
* @private
*/
setViewport(val: ViewContainerRef) {
this._viewport = val;
}
/** /**
* Set the root for the current navigation stack. * Set the root for the current navigation stack.
* @param {Type} page The name of the component you want to push on the navigation stack. * @param {Type} page The name of the component you want to push on the navigation stack.
@ -988,6 +994,9 @@ export class NavController extends Ion {
}); });
} }
/**
* @private
*/
private _setAnimate(opts: NavOptions) { private _setAnimate(opts: NavOptions) {
if ((this._views.length === 1 && !this._init && !this.isPortal) || this.config.get('animate') === false) { if ((this._views.length === 1 && !this._init && !this.isPortal) || this.config.get('animate') === false) {
opts.animate = false; opts.animate = false;
@ -1285,7 +1294,9 @@ export class NavController extends Ion {
// class to the nav when it's finished its first transition // class to the nav when it's finished its first transition
if (!this._init) { if (!this._init) {
this._init = true; this._init = true;
this._renderer.setElementClass(this.elementRef.nativeElement, 'has-views', true); if (!this.isPortal) {
this._renderer.setElementClass(this.getNativeElement(), 'has-views', true);
}
} }
} else { } else {
@ -1406,75 +1417,71 @@ export class NavController extends Ion {
/** /**
* @private * @private
*/ */
loadPage(view: ViewController, navbarContainerRef, opts: NavOptions, done: Function) { loadPage(view: ViewController, navbarContainerRef: ViewContainerRef, opts: NavOptions, done: Function) {
let wtfTimeRangeScope = wtfStartTimeRange('NavController#loadPage', view.name); let wtfTimeRangeScope = wtfStartTimeRange('NavController#loadPage', view.name);
// guts of DynamicComponentLoader#loadIntoLocation if (!this._viewport || !view.componentType) {
this._compiler && this._compiler.compileInHost(view.componentType).then(hostProtoViewRef => { return;
}
let providers = this.providers.concat(ReflectiveInjector.resolve([
provide(ViewController, {useValue: view}),
provide(NavParams, {useValue: view.getNavParams()})
]));
// load the page component inside the nav
this._loader.loadNextToLocation(view.componentType, this._viewport, providers).then(component => {
let wtfScope = wtfCreateScope('NavController#loadPage_After_Compile')(); let wtfScope = wtfCreateScope('NavController#loadPage_After_Compile')();
let providers = this.providers.concat(Injector.resolve([ // the ElementRef of the actual ion-page created
provide(ViewController, {useValue: view}), let pageElementRef = component.location;
provide(NavParams, {useValue: view.getNavParams()})
]));
let location = this.elementRef; // a new ComponentRef has been created
if (this._anchorName) { // set the ComponentRef's instance to its ViewController
location = this._viewManager.getNamedElementInComponentView(location, this._anchorName); view.setInstance(component.instance);
}
let viewContainer = this._viewManager.getViewContainer(location); // remember the ChangeDetectorRef for this ViewController
let hostViewRef: any = view.setChangeDetector(component.changeDetectorRef);
viewContainer.createHostView(hostProtoViewRef, viewContainer.length, providers);
let pageElementRef = this._viewManager.getHostElement(hostViewRef); // remember the ElementRef to the ion-page elementRef that was just created
let component = this._viewManager.getComponent(pageElementRef); view.setPageRef(pageElementRef);
// auto-add page css className created from component JS class name // auto-add page css className created from component JS class name
let cssClassName = pascalCaseToDashCase(view.componentType['name']); let cssClassName = pascalCaseToDashCase(view.componentType['name']);
this._renderer.setElementClass(pageElementRef.nativeElement, cssClassName, true); this._renderer.setElementClass(pageElementRef.nativeElement, cssClassName, true);
view.addDestroy(() => { view.onDestroy(() => {
// ensure the element is cleaned up for when the view pool reuses this element // ensure the element is cleaned up for when the view pool reuses this element
this._renderer.setElementAttribute(pageElementRef.nativeElement, 'class', null); this._renderer.setElementAttribute(pageElementRef.nativeElement, 'class', null);
this._renderer.setElementAttribute(pageElementRef.nativeElement, 'style', null); this._renderer.setElementAttribute(pageElementRef.nativeElement, 'style', null);
component.destroy();
// remove the page from its container
let index = viewContainer.indexOf(hostViewRef);
if (!hostViewRef.destroyed && index !== -1) {
viewContainer.remove(index);
}
view.setInstance(null);
}); });
// a new ComponentRef has been created
// set the ComponentRef's instance to this ViewController
view.setInstance(component);
// remember the ChangeDetectorRef for this ViewController
view.setChangeDetector(hostViewRef.changeDetectorRef);
// remember the ElementRef to the ion-page elementRef that was just created
view.setPageRef(pageElementRef);
if (!navbarContainerRef) { if (!navbarContainerRef) {
// there was not a navbar container ref already provided
// so use the location of the actual navbar template
navbarContainerRef = view.getNavbarViewRef(); navbarContainerRef = view.getNavbarViewRef();
} }
// find a navbar template if one is in the page
let navbarTemplateRef = view.getNavbarTemplateRef(); let navbarTemplateRef = view.getNavbarTemplateRef();
// check if we have both a navbar ViewContainerRef and a template
if (navbarContainerRef && navbarTemplateRef) { if (navbarContainerRef && navbarTemplateRef) {
// let's now create the navbar view
let navbarViewRef = navbarContainerRef.createEmbeddedView(navbarTemplateRef); let navbarViewRef = navbarContainerRef.createEmbeddedView(navbarTemplateRef);
view.addDestroy(() => { view.onDestroy(() => {
let index = navbarContainerRef.indexOf(navbarViewRef); // manually destroy the navbar when the page is destroyed
if (!navbarViewRef.destroyed && index > -1) { navbarViewRef.destroy();
navbarContainerRef.remove(index);
}
}); });
} }
// options may have had a postLoad method
// used mainly by tabs
opts.postLoad && opts.postLoad(view); opts.postLoad && opts.postLoad(view);
// complete wtf loggers
wtfEndTimeRange(wtfTimeRangeScope); wtfEndTimeRange(wtfTimeRangeScope);
wtfLeave(wtfScope); wtfLeave(wtfScope);

View File

@ -1,4 +1,4 @@
import {Directive, ElementRef, Input, Optional, NgZone, Compiler, AppViewManager, Renderer, Type, ContentChild} from 'angular2/core'; import {Directive, ElementRef, Optional, NgZone, Renderer, DynamicComponentLoader, ViewContainerRef} from 'angular2/core';
import {IonicApp} from '../app/app'; import {IonicApp} from '../app/app';
import {Config} from '../../config/config'; import {Config} from '../../config/config';
@ -10,22 +10,23 @@ import {ViewController} from './view-controller';
* @private * @private
*/ */
@Directive({ @Directive({
selector: '[portal]' selector: '[nav-portal]'
}) })
export class Portal extends NavController { export class NavPortal extends NavController {
constructor( constructor(
@Optional() hostNavCtrl: NavController,
@Optional() viewCtrl: ViewController, @Optional() viewCtrl: ViewController,
@Optional() parent: NavController,
app: IonicApp, app: IonicApp,
config: Config, config: Config,
keyboard: Keyboard, keyboard: Keyboard,
elementRef: ElementRef, elementRef: ElementRef,
compiler: Compiler,
viewManager: AppViewManager,
zone: NgZone, zone: NgZone,
renderer: Renderer renderer: Renderer,
loader: DynamicComponentLoader,
viewPort: ViewContainerRef
) { ) {
super(hostNavCtrl, app, config, keyboard, elementRef, null, compiler, viewManager, zone, renderer); super(parent, app, config, keyboard, elementRef, zone, renderer, loader);
this.isPortal = true; this.isPortal = true;
this.setViewport(viewPort);
} }
} }

View File

@ -1,10 +1,9 @@
import {Directive, ElementRef, DynamicComponentLoader, Attribute} from 'angular2/core'; import {Directive, ViewContainerRef, DynamicComponentLoader, Attribute} from 'angular2/core';
import { import {
RouterOutlet, RouterOutlet,
Router, Router,
ComponentInstruction, ComponentInstruction,
Instruction, Instruction} from 'angular2/router';
Location} from 'angular2/router';
import {Nav} from './nav'; import {Nav} from './nav';
import {ViewController} from './view-controller'; import {ViewController} from './view-controller';
@ -21,7 +20,7 @@ export class NavRouter extends RouterOutlet {
private _parent: Router; private _parent: Router;
constructor( constructor(
elementRef: ElementRef, viewContainerRef: ViewContainerRef,
loader: DynamicComponentLoader, loader: DynamicComponentLoader,
parentRouter: Router, parentRouter: Router,
@Attribute('name') nameAttr: string, @Attribute('name') nameAttr: string,
@ -30,7 +29,7 @@ export class NavRouter extends RouterOutlet {
if (nav.parent) { if (nav.parent) {
parentRouter = parentRouter.childRouter(nav); parentRouter = parentRouter.childRouter(nav);
} }
super(elementRef, loader, parentRouter, nameAttr); super(viewContainerRef, loader, parentRouter, nameAttr);
this._nav = nav; this._nav = nav;
this._parent = parentRouter; this._parent = parentRouter;

View File

@ -1,11 +1,11 @@
import {Component, ElementRef, Input, Optional, NgZone, Compiler, AppViewManager, Renderer, Type, ViewChild, ViewEncapsulation} from 'angular2/core'; import {Component, ElementRef, ViewContainerRef, DynamicComponentLoader, Input, Optional, NgZone, Renderer, Type, ViewChild, ViewEncapsulation, AfterViewInit} from 'angular2/core';
import {IonicApp} from '../app/app'; import {IonicApp} from '../app/app';
import {Config} from '../../config/config'; import {Config} from '../../config/config';
import {Keyboard} from '../../util/keyboard'; import {Keyboard} from '../../util/keyboard';
import {isTrueProperty} from '../../util/util'; import {isTrueProperty} from '../../util/util';
import {NavController} from './nav-controller'; import {NavController} from './nav-controller';
import {Portal} from './nav-portal'; import {NavPortal} from './nav-portal';
import {ViewController} from './view-controller'; import {ViewController} from './view-controller';
/** /**
@ -39,7 +39,8 @@ import {ViewController} from './view-controller';
* } * }
* ``` * ```
* *
* <h2 id="back_navigation">Back navigation</h2> * ### Back Navigation
*
* If a [page](../NavController/#creating_pages) you navigate to has a [NavBar](../NavBar/), * If a [page](../NavController/#creating_pages) you navigate to has a [NavBar](../NavBar/),
* Nav will automatically add a back button to it if there is a page * Nav will automatically add a back button to it if there is a page
* before the one you are navigating to in the navigation stack. * before the one you are navigating to in the navigation stack.
@ -105,27 +106,26 @@ import {ViewController} from './view-controller';
*/ */
@Component({ @Component({
selector: 'ion-nav', selector: 'ion-nav',
template: '<div #contents></div><div portal></div>', template: '<div #viewport></div><div nav-portal></div>',
directives: [Portal], directives: [NavPortal],
encapsulation: ViewEncapsulation.None, encapsulation: ViewEncapsulation.None,
}) })
export class Nav extends NavController { export class Nav extends NavController implements AfterViewInit {
private _root: Type; private _root: Type;
private _hasInit: boolean = false; private _hasInit: boolean = false;
constructor( constructor(
@Optional() parent: NavController,
@Optional() viewCtrl: ViewController, @Optional() viewCtrl: ViewController,
@Optional() parent: NavController,
app: IonicApp, app: IonicApp,
config: Config, config: Config,
keyboard: Keyboard, keyboard: Keyboard,
elementRef: ElementRef, elementRef: ElementRef,
compiler: Compiler,
viewManager: AppViewManager,
zone: NgZone, zone: NgZone,
renderer: Renderer renderer: Renderer,
loader: DynamicComponentLoader
) { ) {
super(parent, app, config, keyboard, elementRef, 'contents', compiler, viewManager, zone, renderer); super(parent, app, config, keyboard, elementRef, zone, renderer, loader);
if (viewCtrl) { if (viewCtrl) {
// an ion-nav can also act as an ion-page within a parent ion-nav // an ion-nav can also act as an ion-page within a parent ion-nav
@ -144,6 +144,28 @@ export class Nav extends NavController {
} }
} }
/**
* @private
*/
@ViewChild('viewport', {read: ViewContainerRef})
set _vp(val: ViewContainerRef) {
this.setViewport(val);
}
/**
* @private
*/
ngAfterViewInit() {
this._hasInit = true;
if (this._root) {
if (typeof this._root !== 'function') {
throw 'The [root] property in <ion-nav> must be given a reference to a component class from within the constructor.';
}
this.push(this._root);
}
}
/** /**
* @input {Page} The Page component to load as the root page within this nav. * @input {Page} The Page component to load as the root page within this nav.
*/ */
@ -171,22 +193,8 @@ export class Nav extends NavController {
this._sbEnabled = isTrueProperty(val); this._sbEnabled = isTrueProperty(val);
} }
/** @ViewChild(NavPortal)
* @private private set _np(val: NavPortal) {
*/
ngOnInit() {
this._hasInit = true;
if (this._root) {
if (typeof this._root !== 'function') {
throw 'The [root] property in <ion-nav> must be given a reference to a component class from within the constructor.';
}
this.push(this._root);
}
}
@ViewChild(Portal)
private set _navPortal(val: Portal) {
this.setPortal(val); this.setPortal(val);
} }
} }

View File

@ -24,7 +24,7 @@ import {isPresent} from '../../util/util';
export class ViewController { export class ViewController {
private _cntDir: any; private _cntDir: any;
private _cntRef: ElementRef; private _cntRef: ElementRef;
private _destroys: Array<Function> = []; private _destroys: Function[] = [];
private _hdAttr: string = null; private _hdAttr: string = null;
private _leavingOpts: NavOptions = null; private _leavingOpts: NavOptions = null;
private _loaded: boolean = false; private _loaded: boolean = false;
@ -529,7 +529,7 @@ export class ViewController {
/** /**
* @private * @private
*/ */
addDestroy(destroyFn: Function) { onDestroy(destroyFn: Function) {
this._destroys.push(destroyFn); this._destroys.push(destroyFn);
} }
@ -542,7 +542,7 @@ export class ViewController {
for (var i = 0; i < this._destroys.length; i++) { for (var i = 0; i < this._destroys.length; i++) {
this._destroys[i](); this._destroys[i]();
} }
this._destroys = []; this._destroys.length = 0;
} }
} }

View File

@ -1,5 +1,4 @@
import {Component, Directive, Host, Inject, forwardRef, ElementRef, Compiler, AppViewManager, NgZone, Renderer, Type, ViewEncapsulation, ChangeDetectorRef} from 'angular2/core'; import {Component, Inject, forwardRef, ElementRef, NgZone, Renderer, DynamicComponentLoader, ViewContainerRef, ViewChild, Type, ViewEncapsulation, ChangeDetectorRef, EventEmitter, Input, Output} from 'angular2/core';
import {EventEmitter, Input, Output} from 'angular2/core';
import {IonicApp} from '../app/app'; import {IonicApp} from '../app/app';
import {Config} from '../../config/config'; import {Config} from '../../config/config';
@ -124,15 +123,10 @@ import {TabButton} from './tab-button';
'[attr.aria-labelledby]': '_btnId', '[attr.aria-labelledby]': '_btnId',
'role': 'tabpanel' 'role': 'tabpanel'
}, },
template: '<div #contents></div>', template: '<div #viewport></div>',
encapsulation: ViewEncapsulation.None, encapsulation: ViewEncapsulation.None,
}) })
export class Tab extends NavController { export class Tab extends NavController {
/**
* @private
*/
public isSelected: boolean;
private _isInitial: boolean; private _isInitial: boolean;
private _isEnabled: boolean = true; private _isEnabled: boolean = true;
private _isShown: boolean = true; private _isShown: boolean = true;
@ -141,6 +135,11 @@ export class Tab extends NavController {
private _loaded: boolean; private _loaded: boolean;
private _loadTmr: any; private _loadTmr: any;
/**
* @private
*/
isSelected: boolean;
/** /**
* @private * @private
*/ */
@ -213,14 +212,13 @@ export class Tab extends NavController {
config: Config, config: Config,
keyboard: Keyboard, keyboard: Keyboard,
elementRef: ElementRef, elementRef: ElementRef,
compiler: Compiler,
viewManager: AppViewManager,
zone: NgZone, zone: NgZone,
renderer: Renderer, renderer: Renderer,
loader: DynamicComponentLoader,
private _cd: ChangeDetectorRef private _cd: ChangeDetectorRef
) { ) {
// A Tab is a NavController for its child pages // A Tab is a NavController for its child pages
super(parentTabs, app, config, keyboard, elementRef, 'contents', compiler, viewManager, zone, renderer); super(parentTabs, app, config, keyboard, elementRef, zone, renderer, loader);
parentTabs.add(this); parentTabs.add(this);
@ -228,6 +226,14 @@ export class Tab extends NavController {
this._btnId = 'tab-' + this.id; this._btnId = 'tab-' + this.id;
} }
/**
* @private
*/
@ViewChild('viewport', {read: ViewContainerRef})
set _vp(val: ViewContainerRef) {
this.setViewport(val);
}
/** /**
* @private * @private
*/ */

View File

@ -281,12 +281,7 @@ export class Tabs extends Ion {
this.select(tab); this.select(tab);
}); });
}); });
}
/**
* @private
*/
ngAfterContentInit() {
let preloadTabs = (isBlank(this.preloadTabs) ? this._config.getBoolean('preloadTabs') : isTrueProperty(this.preloadTabs)); let preloadTabs = (isBlank(this.preloadTabs) ? this._config.getBoolean('preloadTabs') : isTrueProperty(this.preloadTabs));
// get the selected index // get the selected index
@ -306,6 +301,7 @@ export class Tabs extends Ion {
selectedIndex = -1; selectedIndex = -1;
} }
}); });
if (selectedIndex < 0) { if (selectedIndex < 0) {
// the selected index wasn't safe to show // the selected index wasn't safe to show
// instead use an available index found to be safe to show // instead use an available index found to be safe to show

View File

@ -1,5 +1,6 @@
import {provide, Provider, ComponentRef, NgZone} from 'angular2/core'; import {provide, Provider, ComponentRef, NgZone} from 'angular2/core';
import {ROUTER_PROVIDERS, LocationStrategy, HashLocationStrategy} from 'angular2/router'; import {ROUTER_PROVIDERS} from 'angular2/router';
import {LocationStrategy, HashLocationStrategy} from 'angular2/platform/common';
import {HTTP_PROVIDERS} from 'angular2/http'; import {HTTP_PROVIDERS} from 'angular2/http';
import {ClickBlock} from '../util/click-block'; import {ClickBlock} from '../util/click-block';

View File

@ -13,7 +13,7 @@
"link": "npm install && gulp src && npm link" "link": "npm install && gulp src && npm link"
}, },
"dependencies": { "dependencies": {
"angular2": "2.0.0-beta.15", "angular2": "2.0.0-beta.16",
"colors": "^1.1.2", "colors": "^1.1.2",
"es6-shim": "^0.35.0", "es6-shim": "^0.35.0",
"inquirer": "0.11.0", "inquirer": "0.11.0",