<!DOCTYPE html>
<html>
<head>
<script data-require="angular.js@1.2.22" data-semver="1.3.0-beta.5" src="https://code.angularjs.org/1.3.0-beta.5/angular.js"></script>
<script data-require="ui-router@*" data-semver="0.2.11" src="https://rawgit.com/angular-ui/ui-router/0.2.11/release/angular-ui-router.js"></script>
<script data-require="ui-router-extras@0.0.10" data-semver="0.0.10" src="https://rawgit.com/christopherthielen/ui-router-extras/0.0.10/release/ct-ui-router-extras.js"></script>
<link data-require="angular-toastr@0.4.0" data-semver="0.4.0" rel="stylesheet" href="https://rawgit.com/Foxandxss/angular-toastr/0.4.0/dist/angular-toastr.css" />
<script data-require="angular-toastr@0.4.0" data-semver="0.4.0" src="https://rawgit.com/Foxandxss/angular-toastr/0.4.0/dist/angular-toastr.js"></script>
<link rel="stylesheet" href="style.css" />
<script src="script.js"></script>
<style>
pre { display: inline-block } ;
</style>
</head>
<body ng-app="demo">
<toaster-container></toaster-container>
<ul>
<li>
<a ui-sref="top">top</a> Uses <b>$scope.$on('$transitionStart')</b> to access the promise
</li>
<li>
<a ui-sref="A">top.A</a> Injects <b>$transition$</b> into the controller
</li>
<li>
<a ui-sref="B">top.A.B</a> Injects <b>$transition$</b> into <b>onEnter/onExit</b>
</li>
<li>
<a ui-sref="C">top.A.B.C</a>
</li>
<li>
<a ui-sref="resolvefail">top.resolvefail</a> Has a resolve that fails to load
</li>
</ul>
<h1>Hello Plunker!</h1>
<ui-view></ui-view>
</body>
</html>
// Code goes here
var app = angular.module("demo", ['ui.router', 'ct.ui.router.extras', 'toastr']);
app.config(function($stateProvider) {
var $sp = $stateProvider;
$sp.state({
name: 'top',
url: "",
template: '<h1>top</h1><ui-view/>',
controller: function($scope, messages, $timeout, toastr) {
$scope.$on("$transitionStart", function(evt, $transition$) {
messages.add("$transition started " + makeMessage($transition$));
$transition$.promise.then(function() {
messages.add("[top] transition success " + makeMessage($transition$));
}, function() {
messages.add("[top] transition failure " + makeMessage($transition$));
});
var kind;
$transition$.promise.then(function() {
kind = "info";
}, function() {
kind = "error";
}).finally(function() {
toast(kind, toastr, messages, $timeout);
});
messages.add("[top] $stateChangeStart event");
});
}
});
$sp.state({
name: 'A',
url: "/a",
parent: 'top',
template: '<h2>A</h2><ui-view/>',
controller: function($transition$, messages) {
$transition$.promise.then(function() {
messages.add(" [A] controller: transition success " + makeMessage($transition$))
}, function() {
messages.add(" [A] controller: transition failure " + makeMessage($transition$))
});
}
});
$sp.state({
name: 'B',
url: "/b",
parent: 'A',
template: '<h2>B</h2><ui-view/>',
onEnter: function($transition$, messages) {
$transition$.promise.then(function() {
messages.add(" [B] onEnter: transition success " + makeMessage($transition$))
}, function() {
messages.add(" [B] onEnter: transition failure " + makeMessage($transition$))
});
},
onExit: function($transition$, messages) {
$transition$.promise.then(function() {
messages.add(" [B] onExit: transition success " + makeMessage($transition$))
}, function() {
messages.add(" [B] onExit: transition failure " + makeMessage($transition$))
});
}
});
$sp.state({
name: 'C',
url: "/c",
parent: 'B',
template: '<h2>C</h2><ui-view/>'
});
$sp.state({
name: 'resolvefail',
url: "/resolvefail",
parent: 'top',
template: '<h2>shouldnt get here</h2><ui-view/>',
resolve: {
fails: function($q) {
return $q.reject("fails");
}
}
});
function makeMessage($transition$) {
return $transition$.from.state.name + "->"+ $transition$.to.state.name;
}
});
app.service('messages', function(toastr) {
var messages = [];
return {
add: function (msg) {
messages.push(msg);
console.log(msg);
},
get: function() {
return messages;
},
clear: function() {
messages = [];
}
}
});
var count = 0;
function toast(type, toastr, messages, $timeout) {
// $timeout(function() {
var msgs = messages.get().map(function(msg) { return "<li>" + msg + "</li>"}).join("");
var msg = "<ul>" + msgs + "</ul>";
var title = "Transition "+ count++;
var opts = { allowHtml: true, positionClass: 'toast-bottom-full-width', };
var fn = toastr[type];
fn(msg, title, opts);
messages.clear();
// });
}
/* Styles go here */