fix(ng-switch): properly destroy child scopes

This commit is contained in:
Igor Minar 2012-03-14 13:03:53 -07:00
parent 8fd1b74872
commit 2315d9b361
2 changed files with 36 additions and 4 deletions

View file

@ -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));
});
}
});

View file

@ -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(
'<ng:switch on="url">' +
'<div ng-switch-when="a">{{name}}</div>' +
'</ng:switch>')($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);
}));
});