I have three tabs in my page. I'm using tabset
and tab
according to Angular Bootstrap Docs.
I set a controller for the <div>
which has the tabset
as
<div ng-controller="Tabs" class="panel panel-default" id="tabs-panel">
<tabset class="panel-body">
<tab heading="Tab 1"> </tab>
<tab heading="Tab 2"> </tab>
<tab heading="Tab 3"> </tab>
</tabset>
</div>
The corresponding page is
But, when I try to add another controller for my 2nd tab as
<div ng-controller="Tabs" class="panel panel-default" id="tabs-panel">
<tabset class="panel-body">
<tab heading="Tab 1"> </tab>
<tab heading="Tab 2" ng-controller="Tab2> </tab>
<tab heading="Tab 3"> </tab>
</tabset>
</div>
I now find that the heading is not displayed and I can no longer click the Tab2.
Why is that? How to get back the same functionality?
Is this the right way to add another controller in an existing controller?
My app.js :
var myApp = angular.module('myApp',['ui.bootstrap']);
myApp.controller('Tabs', function ($scope) {
});
myApp.controller('Tab2', function ($scope) {
});
Add the ng-click directive in the HTML <a> tag of each tab title. At this point, we have indicated to AngularJS that we have 3 different clickable entities: our 3 tab titles. On to ng-if now! The ng-if directive is a conditional expression that determines whether an HTML element should be displayed or not.
AngularJs open link in new tab – you'll use $window service to open a link in new tab in angularjs.
AngularJS controllers are used to control the flow of data of AngularJS application. A controller is defined using ng-controller directive. A controller is a JavaScript object containing attributes/properties and functions.
Overview. Angular Tabs or Tab Panel component is a simple user interface (tabs UI) for organizing related content and occupying a compact space. The tabs are aligned horizontally, and each tab is associated with its header. One of the tabs must always be selected and visible.
I think there are at least three ways you could organize your controller code:
TabController
Please have a look at the demo below or here at jsfiddle.
It's the ui-bootstrap
example code with the above mentioned points added.
angular.module('demoApp', ['ui.bootstrap'])
.controller('TabsDemoCtrl', TabsController)
.directive('sepecialTab', SpecialTab);
function TabsController($scope, $window) {
$scope.tabs = [{
title: 'Dynamic Title 1',
content: 'Dynamic content 1'
}, {
title: 'Dynamic Title 2',
content: 'Dynamic content 2',
disabled: true
}];
$scope.alertMe = function () {
setTimeout(function () {
$window.alert('You\'ve selected the alert tab!');
});
};
$scope.thirdTabCallback = function () {
$scope.test = 'I\'m the third tab callback';
$scope.clickme = function () {
$window.alert('third tab only function');
};
};
}
function SpecialTab() {
return {
restrict: 'A',
controller: function ($scope) {
console.log('Special tab ctrl, runs on start.');
$scope.hello = 'hello from special tab controller';
}
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.3/angular.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.13.1/ui-bootstrap.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.13.1/ui-bootstrap-tpls.js"></script>
<div ng-app="demoApp" ng-controller="TabsDemoCtrl">
<p>Select a tab by setting active binding to true:</p>
<p>
<button class="btn btn-default btn-sm" ng-click="tabs[0].active = true">Select second tab</button>
<button class="btn btn-default btn-sm" ng-click="tabs[1].active = true">Select third tab</button>
</p>
<p>
<button class="btn btn-default btn-sm" ng-click="tabs[1].disabled = ! tabs[1].disabled">Enable / Disable third tab</button>
</p>
<hr />
<tabset>
<tab heading="Static title">Static content</tab>
<tab heading="Static title 2" sepecial-tab="">Static content2 {{hello}}</tab>
<tab heading="Static title 3" select="thirdTabCallback()">Static content3 {{test}}
<button ng-click="clickme()">click me</button>
</tab>
<tab ng-repeat="tab in tabs" heading="{{tab.title}}" active="tab.active" disable="tab.disabled">{{tab.content}}</tab>
<tab select="alertMe()">
<tab-heading> <i class="glyphicon glyphicon-bell"></i> Alert!</tab-heading>I've got an HTML heading, and a select callback. Pretty cool!</tab>
</tabset>
</div>
Here a custom directive to use in tabs, so I can use custom controllers for each tab.
angular.module('myModule', ['ui.bootstrap'])
.directive('tabController', function() {
return {
restrict: 'A',
controller: '@',
name: 'tabController',
}
})
.controller('MyCustomController', function() {
var vm = this;
vm.title = "Hey, I am The first controller";
})
.controller('MyCustomController2', function() {
var vm = this;
vm.title = "Hey, I am the second controller!";
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/2.5.0/ui-bootstrap-tpls.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
<html>
<div ng-app="myModule">
<uib-tabset type="tabs">
<uib-tab tab-controller="MyCustomController as ctrl">
<uib-tab-heading>
<span ng-bind="ctrl.title"></span>
</uib-tab-heading>
<p ng-bind="ctrl.title"></p>
</uib-tab>
<uib-tab tab-controller="MyCustomController2 as ctrl2">
<uib-tab-heading>
<span ng-bind="ctrl2.title"></span>
</uib-tab-heading>
<p ng-bind="ctrl2.title"></p>
</uib-tab>
</uib-tabset>
</div>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With