diff --git a/src/directive/ngSwitch.js b/src/directive/ngSwitch.js index 59c7056efd16..16b0c4d4c6fc 100644 --- a/src/directive/ngSwitch.js +++ b/src/directive/ngSwitch.js @@ -69,19 +69,21 @@ var ngSwitchDirective = valueFn({ element.data(NG_SWITCH, cases); return function(scope, element){ var selectedTransclude, - selectedElement; + selectedElement, + selectedScope; scope.$watch(watchExpr, function(value) { if (selectedElement) { + selectedScope.$destroy(); selectedElement.remove(); - selectedElement = null; + selectedElement = selectedScope = null; } if ((selectedTransclude = cases['!' + value] || cases['?'])) { scope.$eval(attr.change); - selectedTransclude(scope.$new(), function(caseElement, scope) { + selectedScope = scope.$new(); + selectedTransclude(selectedScope, function(caseElement) { selectedElement = caseElement; element.append(caseElement); - element.bind('$destroy', bind(scope, scope.$destroy)); }); } }); diff --git a/test/directive/ngSwitchSpec.js b/test/directive/ngSwitchSpec.js index c61dd60dd091..b0dd74938401 100644 --- a/test/directive/ngSwitchSpec.js +++ b/test/directive/ngSwitchSpec.js @@ -60,4 +60,34 @@ describe('ng-switch', function() { expect($rootScope.name).toEqual('works'); expect(element.text()).toEqual('works'); })); + + + it('should properly create and destory child scopes', inject(function($rootScope, $compile) { + element = $compile( + '' + + '
{{name}}
' + + '
')($rootScope); + $rootScope.$apply(); + + var getChildScope = function() { return element.find('div').scope(); }; + + expect(getChildScope()).toBeUndefined(); + + $rootScope.url = 'a'; + $rootScope.$apply(); + var child1 = getChildScope(); + expect(child1).toBeDefined(); + spyOn(child1, '$destroy'); + + $rootScope.url = 'x'; + $rootScope.$apply(); + expect(getChildScope()).toBeUndefined(); + expect(child1.$destroy).toHaveBeenCalledOnce(); + + $rootScope.url = 'a'; + $rootScope.$apply(); + var child2 = getChildScope(); + expect(child2).toBeDefined(); + expect(child2).not.toBe(child1); + })); });