diff options
| author | Vojta Jina | 2012-03-30 15:03:20 -0700 |
|---|---|---|
| committer | Vojta Jina | 2012-04-03 10:10:44 -0700 |
| commit | 15c1fe392942b70e456f10afbdfd9c3329249a43 (patch) | |
| tree | bec93d124ab8bc1cbd283e250be5b037bcc1fce7 | |
| parent | 428f2b563663315df4f235ca19cef4bdcf82e2ab (diff) | |
| download | angular.js-15c1fe392942b70e456f10afbdfd9c3329249a43.tar.bz2 | |
refactor(ngView): remove extra $watch, refactor one ugly test
| -rw-r--r-- | src/ng/directive/ngView.js | 36 | ||||
| -rw-r--r-- | test/ng/directive/ngViewSpec.js | 40 |
2 files changed, 37 insertions, 39 deletions
diff --git a/src/ng/directive/ngView.js b/src/ng/directive/ngView.js index 95b1546d..b305af0b 100644 --- a/src/ng/directive/ngView.js +++ b/src/ng/directive/ngView.js @@ -115,42 +115,44 @@ var ngViewDirective = ['$http', '$templateCache', '$route', '$anchorScroll', '$c lastScope, onloadExp = attr.onload || ''; - scope.$on('$afterRouteChange', function(event, next, previous) { - changeCounter++; - }); + scope.$on('$afterRouteChange', update); + update(); - scope.$watch(function() {return changeCounter;}, function(newChangeCounter) { - var template = $route.current && $route.current.template; - function destroyLastScope() { - if (lastScope) { - lastScope.$destroy(); - lastScope = null; - } + function destroyLastScope() { + if (lastScope) { + lastScope.$destroy(); + lastScope = null; } + } + + function update() { + var template = $route.current && $route.current.template, + thisChangeId = ++changeCounter; function clearContent() { // ignore callback if another route change occured since - if (newChangeCounter == changeCounter) { + if (thisChangeId === changeCounter) { element.html(''); + destroyLastScope(); } - destroyLastScope(); } if (template) { $http.get(template, {cache: $templateCache}).success(function(response) { // ignore callback if another route change occured since - if (newChangeCounter == changeCounter) { + if (thisChangeId === changeCounter) { element.html(response); destroyLastScope(); var link = $compile(element.contents()), - current = $route.current; + current = $route.current, + controller; lastScope = current.scope = scope.$new(); if (current.controller) { - element.contents(). - data('$ngControllerController', $controller(current.controller, {$scope: lastScope})); + controller = $controller(current.controller, {$scope: lastScope}); + element.contents().data('$ngControllerController', controller); } link(lastScope); @@ -164,7 +166,7 @@ var ngViewDirective = ['$http', '$templateCache', '$route', '$anchorScroll', '$c } else { clearContent(); } - }); + } } }; }]; diff --git a/test/ng/directive/ngViewSpec.js b/test/ng/directive/ngViewSpec.js index 636e15a8..4c0b841b 100644 --- a/test/ng/directive/ngViewSpec.js +++ b/test/ng/directive/ngViewSpec.js @@ -137,33 +137,29 @@ describe('ng-view', function() { }); - it('should be possible to nest ng-view in ng-include', inject(function() { - // TODO(vojta): refactor this test - dealoc(element); - var injector = angular.injector(['ng', 'ngMock', function($routeProvider) { - $routeProvider.when('/foo', {controller: angular.noop, template: 'viewPartial.html'}); - }]); - var myApp = injector.get('$rootScope'); - var $httpBackend = injector.get('$httpBackend'); - $httpBackend.expect('GET', 'includePartial.html').respond('view: <ng:view></ng:view>'); - injector.get('$location').path('/foo'); + it('should be possible to nest ng-view in ng-include', function() { + + module(function($routeProvider) { + $routeProvider.when('/foo', {template: 'viewPartial.html'}); + }); - var $route = injector.get('$route'); + inject(function($httpBackend, $location, $route, $compile, $rootScope) { + $httpBackend.whenGET('includePartial.html').respond('view: <ng:view></ng:view>'); + $httpBackend.whenGET('viewPartial.html').respond('content'); + $location.path('/foo'); - element = injector.get('$compile')( + var elm = $compile( '<div>' + 'include: <ng:include src="\'includePartial.html\'"> </ng:include>' + - '</div>')(myApp); - myApp.$apply(); - - $httpBackend.expect('GET', 'viewPartial.html').respond('content'); - $httpBackend.flush(); + '</div>')($rootScope); + $rootScope.$digest(); + $httpBackend.flush(); - expect(element.text()).toEqual('include: view: content'); - expect($route.current.template).toEqual('viewPartial.html'); - dealoc(myApp); - dealoc(element); - })); + expect(elm.text()).toEqual('include: view: content'); + expect($route.current.template).toEqual('viewPartial.html'); + dealoc(elm) + }); + }); it('should initialize view template after the view controller was initialized even when ' + |
