1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | 1× 18× 18× 18× 18× 18× 18× 9× 9× 5× 5× 1× 5× 5× 9× 2× 2× 18× 8× 1× 7× 7× 7× 7× 7× 7× 7× 1× 1× 6× 1× 18× 1× 1× 1× 1× 1× 1× 19× 19× 19× 18× 18× 1× 1× | import angular from 'angular'; const [handlingStateChangeError, hasOtherwise, stateCounts] = [ Symbol(), Symbol(), Symbol() ]; class RouterHelper { constructor (config, $stateProvider, $urlRouterProvider, $rootScope, $state, Logger, Resolve) { Object.assign(this, {config, $stateProvider, $urlRouterProvider, $rootScope, $state, Logger, Resolve}); // private variable this[handlingStateChangeError] = false; this[hasOtherwise] = false; this[stateCounts] = { errors: 0, changes: 0 }; this.handleRoutingErrors(); this.updateDocTitle(); } configureStates (states, otherwisePath) { const self = this; states.forEach((state) => { // add login check if requireLogin is true const data = state.config.data; if (data && data.requireLogin === true) { state.config.resolve = angular.extend( state.config.resolve || {}, {loginResolve: self.Resolve.login} ); } state.config.resolve = angular.extend(state.config.resolve || {}, self.config.resolveAlways); this.$stateProvider.state(state.state, state.config); }); if (otherwisePath && !this[hasOtherwise]) { this[hasOtherwise] = true; this.$urlRouterProvider.otherwise(otherwisePath); } } handleRoutingErrors () { // Route cancellation: // On routing error, go to the dashboard. // Provide an exit clause if it tries to do it twice. this.$rootScope.$on('$stateChangeError', (event, toState, toParams, fromState, fromParams, error) => { if (this[handlingStateChangeError]) { return; } this[stateCounts].errors++; this[handlingStateChangeError] = true; const destination = (toState && (toState.title || toState.name || toState.loadedTemplateUrl)) || 'unknown target'; const errorMessage = (error && error.message) || error; const msg = `Error routing to ${destination}.\nReason: ${errorMessage}.`; this.Logger.warning(msg); // handle requireLogin issue if (error === 'requireLogin') { this.$state.prev = { state: toState.name, params: toParams }; this.$state.go('root.layout.login'); } else { this.$state.go('root.layout.home'); } } ); } getStates () { return this.$state.get(); } updateDocTitle () { this.$rootScope.$on('$stateChangeSuccess', (event, toState) => { this[stateCounts].changes++; this[handlingStateChangeError] = false; const title = `${toState.data.title} - ${this.config.mainTitle}`; this.$rootScope.title = title; // data bind to <title> this.$rootScope._class = toState.data._class; // data bind to <body> } ); } } // Help configure the state-base ui.router class RouterHelperProvider { constructor ($locationProvider, $stateProvider, $urlRouterProvider) { Object.assign(this, {$locationProvider, $stateProvider, $urlRouterProvider}); this.config = { mainTitle: '', resolveAlways: {} }; this.$locationProvider.html5Mode(true); } configure (cfg) { angular.extend(this.config, cfg); } $get ($rootScope, $state, Logger, Resolve) { return new RouterHelper( this.config, this.$stateProvider, this.$urlRouterProvider, $rootScope, $state, Logger, Resolve); } } RouterHelperProvider.prototype.$get.$inject = [ '$rootScope', '$state', 'Logger', 'Resolve' ]; RouterHelperProvider.$inject = ['$locationProvider', '$stateProvider', '$urlRouterProvider']; export default RouterHelperProvider; |