diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/service/route.js | 18 | ||||
| -rw-r--r-- | src/widgets.js | 39 |
2 files changed, 30 insertions, 27 deletions
diff --git a/src/service/route.js b/src/service/route.js index b7f8bd02..8d8086af 100644 --- a/src/service/route.js +++ b/src/service/route.js @@ -237,22 +237,16 @@ function $RouteProvider(){ function updateRoute() { var next = parseRoute(), - last = $route.current, - Controller; + last = $route.current; if (next && last && next.$route === last.$route && equals(next.pathParams, last.pathParams) && !next.reloadOnSearch && !forceReload) { - next.scope = last.scope; - $route.current = next; - copy(next.params, $routeParams); - last.scope && last.scope.$emit('$routeUpdate'); - } else { + last.params = next.params; + copy(last.params, $routeParams); + $rootScope.$broadcast('$routeUpdate', last); + } else if (next || last) { forceReload = false; $rootScope.$broadcast('$beforeRouteChange', next, last); - if (last && last.scope) { - last.scope.$destroy(); - last.scope = null; - } $route.current = next; if (next) { if (next.redirectTo) { @@ -308,7 +302,5 @@ function $RouteProvider(){ }); return result.join(''); } - - }]; } diff --git a/src/widgets.js b/src/widgets.js index bc41d761..6d64730f 100644 --- a/src/widgets.js +++ b/src/widgets.js @@ -544,22 +544,29 @@ var ngViewDirective = ['$http', '$templateCache', '$route', '$anchorScroll', '$c return { terminal: true, link: function(scope, element) { - var changeCounter = 0; + var changeCounter = 0, + lastScope; - processRoute($route.current); - scope.$on('$afterRouteChange', function(event, next) { + scope.$on('$afterRouteChange', function(event, next, previous) { changeCounter++; - processRoute(next); }); scope.$watch(function() {return changeCounter;}, function(newChangeCounter) { var template = $route.current && $route.current.template; + function destroyLastScope() { + if (lastScope) { + lastScope.$destroy(); + lastScope = null; + } + } + function clearContent() { // ignore callback if another route change occured since if (newChangeCounter == changeCounter) { element.html(''); } + destroyLastScope(); } if (template) { @@ -567,7 +574,20 @@ var ngViewDirective = ['$http', '$templateCache', '$route', '$anchorScroll', '$c // ignore callback if another route change occured since if (newChangeCounter == changeCounter) { element.html(response); - $compile(element.contents())($route.current.scope); + destroyLastScope(); + + var link = $compile(element.contents()), + current = $route.current; + + lastScope = current.scope = scope.$new(); + if (current.controller) { + $controller(current.controller, {$scope: lastScope}); + } + + link(lastScope); + lastScope.$emit('$contentLoaded'); + + // $anchorScroll might listen on event... $anchorScroll(); } }).error(clearContent); @@ -575,15 +595,6 @@ var ngViewDirective = ['$http', '$templateCache', '$route', '$anchorScroll', '$c clearContent(); } }); - - function processRoute(route) { - if (route) { - route.scope = scope.$new(); - if (route.controller) { - $controller(route.controller, {$scope: route.scope}); - } - } - } } }; }]; |
