angular-cached-resource
Version:
An AngularJS module to interact with RESTful resources, even when browser is offline
147 lines (134 loc) • 4.68 kB
JavaScript
/*
* @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
* <pre>
* var app = angular.module('app', ['ui.router.compat']);
*
* app.config(function ($routeProvider) {
* $routeProvider.when('home', {
* controller: function () { ... },
* templateUrl: 'path/to/template'
* });
* });
* </pre>
*
* @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);