angular
.module('myapp', [
'ui.router',
'myapp.home',
'myapp.users'
])
.config(Config);
Config.$inject = [
'$urlRouterProvider',
'$stateProvider'
];
function Config($urlRouterProvider, $stateProvider) {
$urlRouterProvider.otherwise('/home'); // default route
$stateProvider.state('home', {
url: '/home',
templateUrl: 'home.tpl.html',
controller: 'HomeController',
controllerAs: 'home'
})
.state('users', {
url: '/users',
templateUrl: 'users.tpl.html',
controller: 'UsersController',
controllerAs: 'users'
})
.state('users.details', {
url: '/:id',
templateUrl: 'details.tpl.html',
controller: 'DetailsController',
controllerAs: 'details'
});
}
<!DOCTYPE html>
<html ng-app="myapp">
<head>
<meta charset="utf-8" />
<title>AngularJS Plunker</title>
<script>
document.write('<base href="' + document.location + '" />');
</script>
<!-- Bootstrap 3 -->
<script data-require="jquery@2.1.1" data-semver="2.1.1" src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link data-require="bootstrap@*" data-semver="3.2.0" rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.css" />
<link data-require="bootstrap-css@~3.1.1" data-semver="3.1.1" rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" />
<script data-require="bootstrap@*" data-semver="3.2.0" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.js"></script>
<!-- Angular -->
<script data-require="angular.js@~1.4.0-beta.5" data-semver="1.4.0-beta.5" src="https://code.angularjs.org/1.4.0-beta.5/angular.js"></script>
<script data-require="ui-router@*" data-semver="0.2.13" src="//rawgit.com/angular-ui/ui-router/0.2.13/release/angular-ui-router.js"></script>
<!-- App -->
<!-- order is irrelevant after app.js -->
<script src="app.js"></script>
<script src="AppController.js"></script>
<script src="HeaderController.js"></script>
<!-- home -->
<script src="home.js"></script>
<script src="HomeController.js"></script>
<!-- users -->
<!-- now dependencies before users -->
<!-- details -->
<script src="details.js"></script>
<script src="DetailsController.js"></script>
<script src="users.js"></script>
<script src="UsersController.js"></script>
<script src="UsersService.js"></script>
<link rel="stylesheet" href="style.css" />
</head>
<body ng-controller="AppController as app">
<nav class="navbar navbar-default" role="navigation">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
<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" ui-sref="home">Logo</a>
</div>
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li ui-sref-active="active">
<a ui-sref="home">Home</a>
</li>
<li ui-sref-active="active">
<a ui-sref="users">Users</a>
</li>
</ul>
</div>
</div>
</nav>
<div ui-view class="container-fluid slide"></div>
</body>
</html>
/* Put your css in here */
.user-details {
background-color: #eee;
padding-top: 10px;
}
<h1>Hello Plunker</h1>
<p>
<a href="#/users/34">cross link (href)</a><br/>
<a ui-sref="users.details({id:34})">cross link (ui-sref)</a>
</p>
<h1>Users</h1>
<table class="table">
<thead>
<tr>
<th>id</th>
<th>Username</th>
<th>Roles</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="user in users.list">
<td>{{user.id}}</td>
<td><a ui-sref=".details({id:user.id})">{{user.username}}</a></td>
<td>{{user.roles.join(', ')}}</td>
</tr>
</tbody>
</table>
<div ui-view></div>
(function() {
'use strict';
/**
* Users Service
*/
angular
.module('myapp')
.factory('UsersService', Service);
Service.$inject = [
'$filter'
];
function Service($filter){
var users = [{
id: 34,
username: 'batman',
roles: ['admin', 'user']
}, {
id: 67,
username: 'spiderman',
roles: ['user']
}];
var get = function() {
return users;
}
var getById = function(id) {
if(!id) return {};
return $filter('filter')(users, {id:id}, true)[0] || {};
}
return {
get: get,
getById: getById
}
}
})();
(function() {
'use strict';
/**
* Users Controller
*/
angular
.module('myapp.users')
.controller('UsersController', Controller);
Controller.$inject = [
'UsersService'
];
function Controller(UsersService) {
console.log("Users controller instantiated");
var vm = this;
vm.list = UsersService.get();
}
})();
(function() {
'use strict';
/**
* Home Controller
*/
angular
.module('myapp.home')
.controller('HomeController', Controller);
function Controller() {
console.log("Home controller instantiated");
var vm = this;
vm.name = "Plunker";
}
Controller.prototype.canDeactivate = function() {
console.log("Home canDeactivate triggered");
return true;
};
Controller.prototype.deactivate = function() {
console.log("Home deactivate triggered");
};
Controller.prototype.canActivate = function() {
console.log("Home canActivate triggered");
return true;
};
Controller.prototype.activate = function() {
console.log("Home activate triggered");
};
})();
(function() {
'use strict';
/**
* App Controller
*/
angular
.module('myapp')
.controller('AppController', Controller);
function Controller() {
}
})();
angular
.module('myapp.home', [
'myapp.users'
]);
angular
.module('myapp.users', [
'myapp.details'
]);
# Basic website example using Bootstrap 3
Demonstrates a simple website with a top navigation using `ui-router`.
##AngularJS Features
- Modules:
- ui-router
- Directives:
- ng-controller (using controller as notation)
- ui-sref-active
- ui-view
- ui-sref
##Structure
- There are two sections:
- Homepage, 'Home' section with route: `/` or `/home`.
- Users list, 'Users' seciton with route `/users`. Displays a User list.
#Versions
- 3.0
- ui-router version
- 2.0
- Added child route `users/:id` to users
- 1.0
- Added Bootstrap 3 responsive navigation bar
- Added `isActive(route)` to highlight active section
- Applied [John Papas Guidelines](https://github.com/johnpapa/angular-styleguide) to code
#More Information
You can read a post explaining more details [here](http://bit.ly/ngNewRouter)
angular
.module('myapp.details', []);
<div class="container-fluid slide user-details">
<p>Id: {{details.id}}</p>
<p>Username: {{details.username}}</p>
<p>Roles: {{details.roles.join(', ')}}</p>
</div>
(function() {
'use strict';
/**
* Details Controller
*/
angular
.module('myapp.details')
.controller('DetailsController', Controller);
Controller.$inject = [
'UsersService',
'$stateParams'
];
function Controller(UsersService, $stateParams) {
console.log("Details controller");
var vm = this;
angular.extend(vm, UsersService.getById(parseInt($stateParams.id)));
console.log(window.location);
}
})();