diff --git a/ionic/components/app/app.ts b/ionic/components/app/app.ts index c3d088b6ba..38e96b5e8c 100644 --- a/ionic/components/app/app.ts +++ b/ionic/components/app/app.ts @@ -205,10 +205,10 @@ export function ionicBootstrap(cls, config, router) { bootstrap(cls, injectableBindings).then(appRef => { app.load(appRef); - router.load(app, config, window); - - // resolve that the app has loaded - resolve(app); + router.load(window, app, config).then(() => { + // resolve that the app has loaded + resolve(app); + }); }).catch(err => { console.error('ionicBootstrap', err); diff --git a/ionic/routing/hash-url-state.ts b/ionic/routing/hash-url-state.ts index fb80e3687c..9b730d7fc4 100644 --- a/ionic/routing/hash-url-state.ts +++ b/ionic/routing/hash-url-state.ts @@ -4,12 +4,10 @@ import * as util from '../util/util'; class HashUrlStateManager { - constructor(router, ionicApp, ionicConfig, window) { - this.router = router; - this.ionicApp = ionicApp; - this.ionicConfig = ionicConfig; + constructor(window, router) { this.location = window.location; this.history = window.history; + this.router = router; window.addEventListener('popstate', ev => { this.onPopState(ev); @@ -80,7 +78,7 @@ class HashUrlStateManager { } else if (newStateBackPath === lastLoadedStatePath) { // if the last loaded state path is the new state's // back path, then the user is moving forward - this.loadByPath(newStatePath); + this.router.loadByPath(newStatePath); } } @@ -88,10 +86,12 @@ class HashUrlStateManager { getCurrentPath() { // Grab the path without the leading hash - return { - path: this.location.hash.slice(1), - priority: 0 - } + return new Promise(resolve => { + resolve({ + path: this.location.hash.slice(1), + priority: 0 + }) + }); } isDifferentPath(path) { diff --git a/ionic/routing/router.ts b/ionic/routing/router.ts index eb38e24fd4..8a728e5219 100644 --- a/ionic/routing/router.ts +++ b/ionic/routing/router.ts @@ -32,59 +32,81 @@ export class IonicRouter { } } - load(ionicApp, ionicConfig, window) { + load(window, ionicApp, ionicConfig) { // create each of the state manager classes for (let name in stateManagerClasses) { - stateManagers[name] = new stateManagerClasses[name](this, ionicApp, ionicConfig, window); + stateManagers[name] = new stateManagerClasses[name](window, this, ionicApp, ionicConfig); } stateManagerClasses = {}; - this.loadByPath(this.getCurrentPath(), this.otherwise()); + return new Promise(resolve => { + this.getCurrentPath().then(path => { + this.loadByPath(path, this.otherwise()).then(resolve); + }); + }); } loadByPath(path, fallbackRoute) { - let self = this; - let activeViewCtrl = self.activeViewController(); - let matchedRoute = self.match(path) || fallbackRoute; + return new Promise(resolve => { + let self = this; + let activeViewCtrl = self.activeViewController(); + let matchedRoute = self.match(path) || fallbackRoute; - function zoneLoad() { - self._app.zone().run(() => { - activeViewCtrl.push(matchedRoute.cls); - self.lastPath(matchedRoute.path); - }); - } - - if (activeViewCtrl && matchedRoute) { - - if (matchedRoute.cls) { - zoneLoad(); - - } else if (matchedRoute.module) { - System.import(matchedRoute.module).then(m => { - if (m) { - matchedRoute.cls = m[matchedRoute.name]; - zoneLoad(); - } + function zoneLoad() { + self._app.zone().run(() => { + activeViewCtrl.push(matchedRoute.cls); + self.lastPath(matchedRoute.path); + resolve(); + }, err => { + console.error(err); }); } - } + + if (activeViewCtrl && matchedRoute) { + + if (matchedRoute.cls) { + zoneLoad(); + + } else if (matchedRoute.module) { + System.import(matchedRoute.module).then(m => { + if (m) { + matchedRoute.cls = m[matchedRoute.name]; + zoneLoad(); + } + }, err => { + console.error(err); + }); + } + } + }); } getCurrentPath() { // check each of the state managers and the one with the // highest priority wins of knowing what path we are currently at - let rtnPath = null; - let highestPriority = -1; - let currentState = null; + return new Promise(resolve => { - for (let name in stateManagers) { - currentState = stateManagers[name].getCurrentPath(); - if (currentState.path && currentState.priority > highestPriority) { - rtnPath = currentState.path; + let promises = []; + for (let name in stateManagers) { + promises.push(stateManagers[name].getCurrentPath()); } - } - return rtnPath; + // when all the promises have resolved then see which one wins + Promise.all(promises).then(results => { + let rtnPath = null; + let highestPriority = -1; + let state = null; + + for (let i = 0; i < results.length; i++) { + state = results[i]; + if (state.path && state.priority > highestPriority) { + rtnPath = state.path; + } + } + + resolve(rtnPath); + }); + }); } stateChange(type, activeView) {