mirror of
https://github.com/Hopiu/angular.js.git
synced 2026-04-05 15:41:03 +00:00
fix(ng-switch): properly destroy child scopes
This commit is contained in:
parent
8fd1b74872
commit
2315d9b361
2 changed files with 36 additions and 4 deletions
|
|
@ -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));
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}));
|
||||
});
|
||||
|
|
|
|||
Loading…
Reference in a new issue