aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/service/route.js18
-rw-r--r--src/widgets.js39
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});
- }
- }
- }
}
};
}];