123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925 |
- (function(window, angular, undefined) {'use strict';
-
- var ngRouteModule = angular.module('ngRoute', ['ng']).
- provider('$route', $RouteProvider);
- function $RouteProvider(){
- function inherit(parent, extra) {
- return angular.extend(new (angular.extend(function() {}, {prototype:parent}))(), extra);
- }
- var routes = {};
-
- this.when = function(path, route) {
- routes[path] = angular.extend(
- {reloadOnSearch: true},
- route,
- path && pathRegExp(path, route)
- );
-
- if (path) {
- var redirectPath = (path[path.length-1] == '/')
- ? path.substr(0, path.length-1)
- : path +'/';
- routes[redirectPath] = angular.extend(
- {redirectTo: path},
- pathRegExp(redirectPath, route)
- );
- }
- return this;
- };
-
- function pathRegExp(path, opts) {
- var insensitive = opts.caseInsensitiveMatch,
- ret = {
- originalPath: path,
- regexp: path
- },
- keys = ret.keys = [];
- path = path
- .replace(/([().])/g, '\\$1')
- .replace(/(\/)?:(\w+)([\?\*])?/g, function(_, slash, key, option){
- var optional = option === '?' ? option : null;
- var star = option === '*' ? option : null;
- keys.push({ name: key, optional: !!optional });
- slash = slash || '';
- return ''
- + (optional ? '' : slash)
- + '(?:'
- + (optional ? slash : '')
- + (star && '(.+?)' || '([^/]+)')
- + (optional || '')
- + ')'
- + (optional || '');
- })
- .replace(/([\/$\*])/g, '\\$1');
- ret.regexp = new RegExp('^' + path + '$', insensitive ? 'i' : '');
- return ret;
- }
-
- this.otherwise = function(params) {
- this.when(null, params);
- return this;
- };
- this.$get = ['$rootScope',
- '$location',
- '$routeParams',
- '$q',
- '$injector',
- '$http',
- '$templateCache',
- '$sce',
- function($rootScope, $location, $routeParams, $q, $injector, $http, $templateCache, $sce) {
-
-
-
-
-
- var forceReload = false,
- $route = {
- routes: routes,
-
- reload: function() {
- forceReload = true;
- $rootScope.$evalAsync(updateRoute);
- }
- };
- $rootScope.$on('$locationChangeSuccess', updateRoute);
- return $route;
-
-
- function switchRouteMatcher(on, route) {
- var keys = route.keys,
- params = {};
- if (!route.regexp) return null;
- var m = route.regexp.exec(on);
- if (!m) return null;
- for (var i = 1, len = m.length; i < len; ++i) {
- var key = keys[i - 1];
- var val = m[i];
- if (key && val) {
- params[key.name] = val;
- }
- }
- return params;
- }
- function updateRoute() {
- var next = parseRoute(),
- last = $route.current;
- if (next && last && next.$$route === last.$$route
- && angular.equals(next.pathParams, last.pathParams)
- && !next.reloadOnSearch && !forceReload) {
- last.params = next.params;
- angular.copy(last.params, $routeParams);
- $rootScope.$broadcast('$routeUpdate', last);
- } else if (next || last) {
- forceReload = false;
- $rootScope.$broadcast('$routeChangeStart', next, last);
- $route.current = next;
- if (next) {
- if (next.redirectTo) {
- if (angular.isString(next.redirectTo)) {
- $location.path(interpolate(next.redirectTo, next.params)).search(next.params)
- .replace();
- } else {
- $location.url(next.redirectTo(next.pathParams, $location.path(), $location.search()))
- .replace();
- }
- }
- }
- $q.when(next).
- then(function() {
- if (next) {
- var locals = angular.extend({}, next.resolve),
- template, templateUrl;
- angular.forEach(locals, function(value, key) {
- locals[key] = angular.isString(value) ?
- $injector.get(value) : $injector.invoke(value);
- });
- if (angular.isDefined(template = next.template)) {
- if (angular.isFunction(template)) {
- template = template(next.params);
- }
- } else if (angular.isDefined(templateUrl = next.templateUrl)) {
- if (angular.isFunction(templateUrl)) {
- templateUrl = templateUrl(next.params);
- }
- templateUrl = $sce.getTrustedResourceUrl(templateUrl);
- if (angular.isDefined(templateUrl)) {
- next.loadedTemplateUrl = templateUrl;
- template = $http.get(templateUrl, {cache: $templateCache}).
- then(function(response) { return response.data; });
- }
- }
- if (angular.isDefined(template)) {
- locals['$template'] = template;
- }
- return $q.all(locals);
- }
- }).
-
- then(function(locals) {
- if (next == $route.current) {
- if (next) {
- next.locals = locals;
- angular.copy(next.params, $routeParams);
- }
- $rootScope.$broadcast('$routeChangeSuccess', next, last);
- }
- }, function(error) {
- if (next == $route.current) {
- $rootScope.$broadcast('$routeChangeError', next, last, error);
- }
- });
- }
- }
-
- function parseRoute() {
-
- var params, match;
- angular.forEach(routes, function(route, path) {
- if (!match && (params = switchRouteMatcher($location.path(), route))) {
- match = inherit(route, {
- params: angular.extend({}, $location.search(), params),
- pathParams: params});
- match.$$route = route;
- }
- });
-
- return match || routes[null] && inherit(routes[null], {params: {}, pathParams:{}});
- }
-
- function interpolate(string, params) {
- var result = [];
- angular.forEach((string||'').split(':'), function(segment, i) {
- if (i === 0) {
- result.push(segment);
- } else {
- var segmentMatch = segment.match(/(\w+)(.*)/);
- var key = segmentMatch[1];
- result.push(params[key]);
- result.push(segmentMatch[2] || '');
- delete params[key];
- }
- });
- return result.join('');
- }
- }];
- }
- ngRouteModule.provider('$routeParams', $RouteParamsProvider);
- function $RouteParamsProvider() {
- this.$get = function() { return {}; };
- }
- ngRouteModule.directive('ngView', ngViewFactory);
- ngRouteModule.directive('ngView', ngViewFillContentFactory);
- ngViewFactory.$inject = ['$route', '$anchorScroll', '$animate'];
- function ngViewFactory( $route, $anchorScroll, $animate) {
- return {
- restrict: 'ECA',
- terminal: true,
- priority: 400,
- transclude: 'element',
- link: function(scope, $element, attr, ctrl, $transclude) {
- var currentScope,
- currentElement,
- previousElement,
- autoScrollExp = attr.autoscroll,
- onloadExp = attr.onload || '';
- scope.$on('$routeChangeSuccess', update);
- update();
- function cleanupLastView() {
- if(previousElement) {
- previousElement.remove();
- previousElement = null;
- }
- if(currentScope) {
- currentScope.$destroy();
- currentScope = null;
- }
- if(currentElement) {
- $animate.leave(currentElement, function() {
- previousElement = null;
- });
- previousElement = currentElement;
- currentElement = null;
- }
- }
- function update() {
- var locals = $route.current && $route.current.locals,
- template = locals && locals.$template;
- if (angular.isDefined(template)) {
- var newScope = scope.$new();
- var current = $route.current;
-
-
-
-
-
-
- var clone = $transclude(newScope, function(clone) {
- $animate.enter(clone, null, currentElement || $element, function onNgViewEnter () {
- if (angular.isDefined(autoScrollExp)
- && (!autoScrollExp || scope.$eval(autoScrollExp))) {
- $anchorScroll();
- }
- });
- cleanupLastView();
- });
- currentElement = clone;
- currentScope = current.scope = newScope;
- currentScope.$emit('$viewContentLoaded');
- currentScope.$eval(onloadExp);
- } else {
- cleanupLastView();
- }
- }
- }
- };
- }
- ngViewFillContentFactory.$inject = ['$compile', '$controller', '$route'];
- function ngViewFillContentFactory($compile, $controller, $route) {
- return {
- restrict: 'ECA',
- priority: -400,
- link: function(scope, $element) {
- var current = $route.current,
- locals = current.locals;
- $element.html(locals.$template);
- var link = $compile($element.contents());
- if (current.controller) {
- locals.$scope = scope;
- var controller = $controller(current.controller, locals);
- if (current.controllerAs) {
- scope[current.controllerAs] = controller;
- }
- $element.data('$ngControllerController', controller);
- $element.children().data('$ngControllerController', controller);
- }
- link(scope);
- }
- };
- }
- })(window, window.angular);
|