/* * @ngdoc object * @name ui.router.compat.$routeProvider * * @requires ui.router.state.$stateProvider * @requires ui.router.router.$urlRouterProvider * * @description * `$routeProvider` of the `ui.router.compat` module overwrites the existing * `routeProvider` from the core. This is done to provide compatibility between * the UI Router and the core router. * * It also provides a `when()` method to register routes that map to certain urls. * Behind the scenes it actually delegates either to * {@link ui.router.router.$urlRouterProvider $urlRouterProvider} or to the * {@link ui.router.state.$stateProvider $stateProvider} to postprocess the given * router definition object. */ $RouteProvider.$inject = ['$stateProvider', '$urlRouterProvider']; function $RouteProvider( $stateProvider, $urlRouterProvider) { var routes = []; onEnterRoute.$inject = ['$$state']; function onEnterRoute( $$state) { /*jshint validthis: true */ this.locals = $$state.locals.globals; this.params = this.locals.$stateParams; } function onExitRoute() { /*jshint validthis: true */ this.locals = null; this.params = null; } this.when = when; /* * @ngdoc function * @name ui.router.compat.$routeProvider#when * @methodOf ui.router.compat.$routeProvider * * @description * Registers a route with a given route definition object. The route definition * object has the same interface the angular core route definition object has. * * @example *
* var app = angular.module('app', ['ui.router.compat']); * * app.config(function ($routeProvider) { * $routeProvider.when('home', { * controller: function () { ... }, * templateUrl: 'path/to/template' * }); * }); ** * @param {string} url URL as string * @param {object} route Route definition object * * @return {object} $routeProvider - $routeProvider instance */ function when(url, route) { /*jshint validthis: true */ if (route.redirectTo != null) { // Redirect, configure directly on $urlRouterProvider var redirect = route.redirectTo, handler; if (isString(redirect)) { handler = redirect; // leave $urlRouterProvider to handle } else if (isFunction(redirect)) { // Adapt to $urlRouterProvider API handler = function (params, $location) { return redirect(params, $location.path(), $location.search()); }; } else { throw new Error("Invalid 'redirectTo' in when()"); } $urlRouterProvider.when(url, handler); } else { // Regular route, configure as state $stateProvider.state(inherit(route, { parent: null, name: 'route:' + encodeURIComponent(url), url: url, onEnter: onEnterRoute, onExit: onExitRoute })); } routes.push(route); return this; } /* * @ngdoc object * @name ui.router.compat.$route * * @requires ui.router.state.$state * @requires $rootScope * @requires $routeParams * * @property {object} routes - Array of registered routes. * @property {object} params - Current route params as object. * @property {string} current - Name of the current route. * * @description * The `$route` service provides interfaces to access defined routes. It also let's * you access route params through `$routeParams` service, so you have fully * control over all the stuff you would actually get from angular's core `$route` * service. */ this.$get = $get; $get.$inject = ['$state', '$rootScope', '$routeParams']; function $get( $state, $rootScope, $routeParams) { var $route = { routes: routes, params: $routeParams, current: undefined }; function stateAsRoute(state) { return (state.name !== '') ? state : undefined; } $rootScope.$on('$stateChangeStart', function (ev, to, toParams, from, fromParams) { $rootScope.$broadcast('$routeChangeStart', stateAsRoute(to), stateAsRoute(from)); }); $rootScope.$on('$stateChangeSuccess', function (ev, to, toParams, from, fromParams) { $route.current = stateAsRoute(to); $rootScope.$broadcast('$routeChangeSuccess', stateAsRoute(to), stateAsRoute(from)); copy(toParams, $route.params); }); $rootScope.$on('$stateChangeError', function (ev, to, toParams, from, fromParams, error) { $rootScope.$broadcast('$routeChangeError', stateAsRoute(to), stateAsRoute(from), error); }); return $route; } } angular.module('ui.router.compat') .provider('$route', $RouteProvider) .directive('ngView', $ViewDirective);