<html ng-app="app" ng-controller="AppCtrl as base">
<head>
<meta charset="utf-8">
<title>JS Bin</title>
<!-- Base styles -->
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ng-table/0.4.3/ng-table.css">
<!-- Base styles -->
<!-- Base scripts (libraries) -->
<script src="//code.jquery.com/jquery.min.js"></script>
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-route.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-sanitize.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-cookies.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-messages.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-resource.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.6/moment.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ng-table/0.4.3/ng-table.js"></script>
<!-- Base scripts -->
</head>
<body>
<nav class="navbar navbar-default navbar-static-top" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">JS Bin</a>
</div>
</div>
</nav>
<div class="container" ng-cloak>
<div class="row">
<div class="col-xs-12">
<form name="form" role="form">
<div class="form-group">
<label for="field">Field</label>
<input type="text" class="form-control" id="field" placeholder="Field" name="field" />
</div>
<div class="form-group">
<app-component></app-component>
</div>
<div class="form-group">
<parent-directive></parent-directive>
</div>
</form>
</div>
</div>
</div>
<script type="text/ng-template" id="parent_directive.html">
<div class="highlight">
<div class="change-button">
<!-- <button ng-click="$ctrl.changeState()" class="btn btn-sm btn-info" parent-directive-button-handler>Change</button> -->
<button ng-click="$ctrl.changeState()" class="btn btn-sm btn-info">Change</button>
</div>
<child-directive state="$ctrl.state"></child-directive>
<another-child-directive></another-child-directive>
<div>
</script>
</body>
</html>
angular.module('app', [])
.controller('AppCtrl', function($scope) {
});
angular.module('app')
.service('AppService', function() {
});
angular.module('app')
.factory('AppFactory', function() {
return {
};
});
angular.module('app')
.directive('appDirective', function() {
return {
restrict: 'A'
};
});
angular.module('app')
.component('appComponent', {
template: '<div>{{$ctrl.text}}</div>',
controller: function() {
this.text = 'Component is located here!';
}
});
angular.module('app')
.filter('appFilter', function() {
return function(input) {
return input;
};
});
angular.module('app')
.component('parentDirective', {
templateUrl: 'parent_directive.html',
controller: function($timeout) {
var ctrl = this;
this.state = true;
this.changeState = function() {
ctrl.state = !ctrl.state;
}.bind(this);
}
});
angular.module('app')
.directive('parentDirectiveButtonHandler', function($timeout) {
return {
restrict: 'A',
scope: {},
link: function(scope, iElement, iAttrs) {
$timeout(function() {
iElement.trigger('click');
});
}
};
});
angular.module('app')
.component('childDirective', {
bindings: {
state: '<'
},
template: '{{$ctrl.text}} {{$ctrl.changeState}}!<br />',
controller: function() {
var ctrl = this;
updateState();
this.$onChanges = function() {
updateState();
};
function updateState() {
ctrl.text = '' + ctrl.state;
ctrl.changeState = Date.now();
}
}
});
angular.module('app')
.directive('anotherChildDirective', function() {
return {
restrict: 'E',
scope: {},
template: '{{text}} {{changeState}}!<br />',
controller: function($scope) {
$scope.changeState = 'unchanged';
$scope.text = 'Another child directive';
$scope.$on('SOME_EVENT_NAME', function() {
$scope.changeState = 'changed';
});
}
};
});
Output
This bin was created anonymously and its free preview time has expired (learn why). — Get a free unrestricted account
Dismiss xKeyboard 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. |