diff --git a/src/tabs/tabs.js b/src/tabs/tabs.js index e1b5ee8485..f3a903f2db 100644 --- a/src/tabs/tabs.js +++ b/src/tabs/tabs.js @@ -37,14 +37,19 @@ angular.module('ui.bootstrap.tabs', []) ctrl.removeTab = function removeTab(tab) { var index = tabs.indexOf(tab); - //Select a new tab if the tab to be removed is selected - if (tab.active && tabs.length > 1) { + //Select a new tab if the tab to be removed is selected and not destroying + if (tab.active && tabs.length > 1 && !destroyed) { //If this is the last tab, select the previous tab. else, the next tab. var newActiveIndex = index == tabs.length - 1 ? index - 1 : index + 1; ctrl.select(tabs[newActiveIndex]); } tabs.splice(index, 1); }; + + var destroyed; + $scope.$on('$destroy', function() { + destroyed = true; + }); }]) /** diff --git a/src/tabs/test/tabs.spec.js b/src/tabs/test/tabs.spec.js index bf5e2c671c..622182a19a 100644 --- a/src/tabs/test/tabs.spec.js +++ b/src/tabs/test/tabs.spec.js @@ -513,6 +513,45 @@ describe('tabs', function() { expect(titles().eq(1)).toHaveClass('active'); expect(contents().eq(1)).toHaveClass('active'); })); + + it('should not select tabs when being destroyed', inject(function($controller, $compile, $rootScope){ + var selectList = [], + deselectList = [], + getTab = function(active){ + return { + active: active, + select : function(){ + selectList.push('select'); + }, + deselect : function(){ + deselectList.push('deselect'); + } + }; + }; + + scope = $rootScope.$new(); + scope.tabs = [ + getTab(true), + getTab(false) + ]; + elm = $compile([ + '', + ' ', + ' heading {{index}}', + ' content {{$index}}', + ' ', + '' + ].join('\n'))(scope); + scope.$apply(); + + // The first tab is selected the during the initial $digest. + expect(selectList.length).toEqual(1); + + // Destroy the tabs - we should not trigger selection/deselection any more. + scope.$destroy(); + expect(selectList.length).toEqual(1); + expect(deselectList.length).toEqual(0); + })); }); describe('disabled', function() {