/** * @ngdoc directive * @name ionTab * @module ionic * @restrict E * @parent ionic.directive:ionTabs * * @description * Contains a tab's content. The content only exists while the given tab is selected. * * Each ionTab has its own view history. * * @usage * ```html * * * ``` * For a complete, working tab bar example, see the {@link ionic.directive:ionTabs} documentation. * * @param {string} title The title of the tab. * @param {string=} href The link that this tab will navigate to when tapped. * @param {string=} icon The icon of the tab. If given, this will become the default for icon-on and icon-off. * @param {string=} icon-on The icon of the tab while it is selected. * @param {string=} icon-off The icon of the tab while it is not selected. * @param {expression=} badge The badge to put on this tab (usually a number). * @param {expression=} badge-style The style of badge to put on this tab (eg tabs-positive). * @param {expression=} on-select Called when this tab is selected. * @param {expression=} on-deselect Called when this tab is deselected. * @param {expression=} ng-click By default, the tab will be selected on click. If ngClick is set, it will not. You can explicitly switch tabs using {@link ionic.service:$ionicTabsDelegate#select $ionicTabsDelegate.select()}. */ IonicModule .directive('ionTab', [ '$rootScope', '$animate', '$ionicBind', '$compile', function($rootScope, $animate, $ionicBind, $compile) { //Returns ' key="value"' if value exists function attrStr(k,v) { return angular.isDefined(v) ? ' ' + k + '="' + v + '"' : ''; } return { restrict: 'E', require: ['^ionTabs', 'ionTab'], replace: true, controller: '$ionicTab', scope: true, compile: function(element, attr) { //We create the tabNavTemplate in the compile phase so that the //attributes we pass down won't be interpolated yet - we want //to pass down the 'raw' versions of the attributes var tabNavTemplate = ''; //Remove the contents of the element so we can compile them later, if tab is selected //We don't use regular transclusion because it breaks element inheritance var tabContent = angular.element('
') .append( element.contents().remove() ); return function link($scope, $element, $attr, ctrls) { var childScope; var childElement; var tabsCtrl = ctrls[0]; var tabCtrl = ctrls[1]; var navView = tabContent[0].querySelector('ion-nav-view') || tabContent[0].querySelector('data-ion-nav-view'); var navViewName = navView && navView.getAttribute('name'); $ionicBind($scope, $attr, { animate: '=', onSelect: '&', onDeselect: '&', title: '@', uiSref: '@', href: '@', }); tabsCtrl.add($scope); $scope.$on('$destroy', function() { tabsCtrl.remove($scope); tabNavElement.isolateScope().$destroy(); tabNavElement.remove(); }); //Remove title attribute so browser-tooltip does not apear $element[0].removeAttribute('title'); if (navViewName) { tabCtrl.navViewName = navViewName; } $scope.$on('$stateChangeSuccess', selectIfMatchesState); selectIfMatchesState(); function selectIfMatchesState() { if (tabCtrl.tabMatchesState()) { tabsCtrl.select($scope); } } var tabNavElement = angular.element(tabNavTemplate); tabNavElement.data('$ionTabsController', tabsCtrl); tabNavElement.data('$ionTabController', tabCtrl); tabsCtrl.$tabsElement.append($compile(tabNavElement)($scope)); $scope.$watch('$tabSelected', function(value) { childScope && childScope.$destroy(); childScope = null; childElement && $animate.leave(childElement); childElement = null; if (value) { childScope = $scope.$new(); childElement = tabContent.clone(); $animate.enter(childElement, tabsCtrl.$element); $compile(childElement)(childScope); } }); }; } }; }]);