<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap-theme.min.css">
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.5/angular.js"></script>
</head>
<body>
<div ng-app="app">
<script type="text/ng-template" id="tabs.html">
<div class="tabbable">
<ul class="nav nav-tabs">
<li ng-repeat="pane in tabs.panes" ng-class="{active:pane.selected}">
<a href="" ng-click="tabs.select(pane)">{{pane.title}}</a>
</li>
</ul>
<div class="tab-content" ng-transclude></div>
</div>
</script>
<script type="text/ng-template" id="pane.html">
<div class="tab-pane" ng-class="{active: pane.selected}" ng-transclude>
</div>
</script>
<tabs>
<pane title="Localization">
Date: {{ '2012-04-01' | date:'fullDate' }} <br>
Currency: {{ 123456 | currency }} <br>
Number: {{ 98765.4321 | number }} <br>
</pane>
<pane title="Pluralization">
Some other stuff
</pane>
<pane title="Third">
whee
</pane>
<pane title="Fourth">
okay
</pane>
</tabs>
</div>
</body>
</html>
angular.module('app', [])
.directive('tabs', function () {
return {
transclude: true,
scope: {},
templateUrl: 'tabs.html',
bindToController: true,
controller: "TabsController as tabs"
};
})
.controller('TabsController', function TabsController() {
var tabs = this;
tabs.panes = [];
tabs.select = function (pane) {
angular.forEach(tabs.panes, function (pane) {
pane.selected = false;
});
pane.selected = true;
}
tabs.addPane = function (pane) {
if (tabs.panes.length == 0) tabs.select(pane);
tabs.panes.push(pane);
}
})
.directive('pane', function () {
return {
transclude: true,
scope: {
title: '@'
},
templateUrl: 'pane.html',
bindToController: true,
controller: 'PaneController as pane',
// "replace:true" is deprecated https://docs.angularjs.org/api/ng/service/$compile
// but it breaks the example :/
replace: true
//I'm trying to remove the "require:'^tabs' so I don't
// have to pass the ctrl into a linking function"
};
})
.controller("PaneController", function PaneController($element) {
var pane = this;
pane.selected = false;
//I feel like I need a 'resolve' on directives so I
//can pass whatever I want into directive controllers
var tabs = $element.controller('tabs');
tabs.addPane(pane);
})
Output
You can jump to the latest bin by adding /latest
to your URL
Keyboard Shortcuts
Shortcut | Action |
---|---|
ctrl + [num] | Toggle nth panel |
ctrl + 0 | Close focused panel |
ctrl + enter | Re-render output. If console visible: run JS in console |
Ctrl + l | Clear the console |
ctrl + / | Toggle comment on selected lines |
ctrl + ] | Indents selected lines |
ctrl + [ | Unindents selected lines |
tab | Code complete & Emmet expand |
ctrl + shift + L | Beautify code in active panel |
ctrl + s | Save & lock current Bin from further changes |
ctrl + shift + s | Open the share options |
ctrl + y | Archive Bin |
Complete list of JS Bin shortcuts |
JS Bin URLs
URL | Action |
---|---|
/ | Show the full rendered output. This content will update in real time as it's updated from the /edit url. |
/edit | Edit the current bin |
/watch | Follow a Code Casting session |
/embed | Create an embeddable version of the bin |
/latest | Load the very latest bin (/latest goes in place of the revision) |
/[username]/last | View the last edited bin for this user |
/[username]/last/edit | Edit the last edited bin for this user |
/[username]/last/watch | Follow the Code Casting session for the latest bin for this user |
/quiet | Remove analytics and edit button from rendered output |
.js | Load only the JavaScript for a bin |
.css | Load only the CSS for a bin |
Except for username prefixed urls, the url may start with http://jsbin.com/abc and the url fragments can be added to the url to view it differently. |