var app = angular.module('plunker', []);

app.config(function($routeProvider) {
  $routeProvider
    .when("/", {
      template: "<b>Home!</b>"
    }) 
    .when("/1", {
      template: "<b>Page 1!</b>"
    })
    .when("/2", {
      template: "<b>Page 2!</b>"
    })
    .otherwise({
      redirectTo: "/"
    });
});

app.controller('MainCtrl', function($scope, flash) {
  $scope.msgTitle = 'Alert';
  $scope.msgBody  = 'The Tomatoes Exploded!';
  $scope.msgType  = 'warning';

  $scope.flash = flash;
}); 
 
app.factory("flash", function($rootScope) {
  var queue = [], currentMessage = {};
  
  $rootScope.$on('$routeChangeSuccess', function() {
    if (queue.length > 0) 
      currentMessage = queue.shift();
    else
      currentMessage = {};
  });
  
  return {
    set: function(message) {
      var msg = message;
      queue.push(msg);

    },
    get: function(message) {
      return currentMessage;
    },
    pop: function(message) {
      switch(message.type) {
        case 'success':
          toastr.success(message.body, message.title);
          break;
        case 'info':
          toastr.info(message.body, message.title);
          break;
        case 'warning':
          toastr.warning(message.body, message.title);
          break;
        case 'error':
          toastr.error(message.body, message.title);
          break;
      }
    }
  };
});
<!doctype html>
<html ng-app="plunker" >
<head>
  <meta charset="utf-8">
  <title>AngularJS Plunker</title>
  <link rel="stylesheet" href="http://twitter.github.com/bootstrap/assets/css/bootstrap.css">
  <link rel="stylesheet" href="style.css">
  <script>document.write("<base href=\"" + document.location + "\" />");</script>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.js"></script>
  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
  <!--<script src="https://raw.github.com/CodeSeven/toastr/master/toastr.js"></script>-->
  <!-- toastr is included inline -->
  <script type="text/javascript">
  /*
 * Copyright 2012 John Papa and Hans Fjällemark.  
 * All Rights Reserved.  
 * Use, reproduction, distribution, and modification of this code is subject to the terms and 
 * conditions of the MIT license, available at http://www.opensource.org/licenses/mit-license.php
 *
 * Author: John Papa and Hans Fjällemark
 * Project: https://github.com/CodeSeven/toastr
 */
; (function (define) {
  define(['jquery'], function ($) {
  	return (function () {
			var version = '1.3.1',
				$container,
			    toastType = {
			        error: 'error',
			        info: 'info',
			        success: 'success',
			        warning: 'warning'
			    },
				listener,
				toastId = 0,

				defaults = {
					tapToDismiss: true,
					toastClass: 'toast',
					containerId: 'toast-container',
					debug: false,
					fadeIn: 300,
					onFadeIn: undefined,
					fadeOut: 1000,
					onFadeOut: undefined,
					extendedTimeOut: 1000,
					iconClasses: {
						error: 'toast-error',
						info: 'toast-info',
						success: 'toast-success',
						warning: 'toast-warning'
					},
					iconClass: 'toast-info',
					positionClass: 'toast-top-right',
					timeOut: 5000, // Set timeOut and extendedTimeout to 0 to make it sticky
					titleClass: 'toast-title',
					messageClass: 'toast-message',
					target: 'body',
					newestOnTop: true
				},

				error = function (message, title, optionsOverride) {
				    return notify({
				        type: toastType.error,
						iconClass: getOptions().iconClasses.error,
						message: message,
						optionsOverride: optionsOverride,
						title: title
					});
				},

				info = function (message, title, optionsOverride) {
					return notify({
					    type: toastType.info,
					    iconClass: getOptions().iconClasses.info,
						message: message,
						optionsOverride: optionsOverride,
						title: title
					});
				},

				subscribe = function (callback) {
					listener = callback;
				},

				success = function (message, title, optionsOverride) {
					return notify({
					    type: toastType.success,
					    iconClass: getOptions().iconClasses.success,
						message: message,
						optionsOverride: optionsOverride,
						title: title
					});
				},

				warning = function (message, title, optionsOverride) {
					return notify({
					    type: toastType.warning,
					    iconClass: getOptions().iconClasses.warning,
						message: message,
						optionsOverride: optionsOverride,
						title: title
					});
				},

				clear = function ($toastElement) {
					var options = getOptions();
					if (!$container) {
						getContainer(options);
					}
					if ($toastElement && $(':focus', $toastElement).length === 0) {
						$toastElement.fadeOut(options.fadeOut, function () {
							removeToast($toastElement);
						});
						return;
					}
					if ($container.children().length) {
						$container.fadeOut(options.fadeOut, function () {
							$container.remove();
						});
					}
				};

			var toastr = {
				clear: clear,
				error: error,
				getContainer: getContainer,
				info: info,
				options: {},
				subscribe: subscribe,
				success: success,
				version: version,
				warning: warning
			};

			return toastr;

			//#region Internal Methods

			function publish(args) {
				if (!listener) {
					return;
				}
				listener(args);
			}

			function notify(map) {
				var
					options = getOptions(),
					iconClass = map.iconClass || options.iconClass;

				if (typeof (map.optionsOverride) !== 'undefined') {
					options = $.extend(options, map.optionsOverride);
					iconClass = map.optionsOverride.iconClass || iconClass;
				}

				toastId++;

				$container = getContainer(options);
				var
					intervalId = null,
					$toastElement = $('<div/>'),
					$titleElement = $('<div/>'),
					$messageElement = $('<div/>'),
					response = {
						toastId: toastId,
						state: 'visible',
						startTime: new Date(),
						options: options,
						map: map
					};

				if (map.iconClass) {
					$toastElement.addClass(options.toastClass).addClass(iconClass);
				}

				if (map.title) {
					$titleElement.append(map.title).addClass(options.titleClass);
					$toastElement.append($titleElement);
				}

				if (map.message) {
					$messageElement.append(map.message).addClass(options.messageClass);
					$toastElement.append($messageElement);
				}

				$toastElement.hide();
				if (options.newestOnTop) {
					$container.prepend($toastElement);
				} else {
					$container.append($toastElement);
				}
				$toastElement.fadeIn(options.fadeIn, options.onFadeIn);
				if (options.timeOut > 0) {
					intervalId = setTimeout(fadeAway, options.timeOut);
				}

				$toastElement.hover(stickAround, delayedFadeAway);
				if (!options.onclick && options.tapToDismiss) {
					$toastElement.click(fadeAway);
				}

				if (options.onclick) {
					$toastElement.click(function () {
						options.onclick() && fadeAway();
					});
				}

				publish(response);

				if (options.debug && console) {
					console.log(response);
				}

				return $toastElement;

				function fadeAway() {
					if ($(':focus', $toastElement).length > 0) {
						return;
					}
					return $toastElement.fadeOut(options.fadeOut, function () {
						removeToast($toastElement);
						if (options.onFadeOut) {
							options.onFadeOut();
						}
						response.state = 'hidden';
					    response.endTime = new Date(),
						publish(response);
					});
				}

				function delayedFadeAway() {
					if (options.timeOut > 0 || options.extendedTimeOut > 0) {
						intervalId = setTimeout(fadeAway, options.extendedTimeOut);
					}
				}

				function stickAround() {
					clearTimeout(intervalId);
					$toastElement.stop(true, true).fadeIn(options.fadeIn);
				}
			}
			function getContainer(options) {
				if (!options) { options = getOptions(); }
				$container = $('#' + options.containerId);
				if ($container.length) {
					return $container;
				}
				$container = $('<div/>')
					.attr('id', options.containerId)
					.addClass(options.positionClass);
				$container.appendTo($(options.target));
				return $container;
			}

			function getOptions() {
				return $.extend({}, defaults, toastr.options);
			}

			function removeToast($toastElement) {
				if (!$container) { $container = getContainer(); }
				if ($toastElement.is(':visible')) {
					return;
				}
				$toastElement.remove();
				$toastElement = null;
				if ($container.children().length === 0) {
					$container.remove();
				}
			}
			//#endregion

		})();
	});
}(typeof define === 'function' && define.amd ? define : function (deps, factory) {
	if (typeof module !== 'undefined' && module.exports) { //Node
		module.exports = factory(require(deps[0]));
	} else {
		window['toastr'] = factory(window['jQuery']);
	}
}));
</script>
  <script src="app.js"></script>
</head>

<body ng-controller="MainCtrl">
  <div class="well">
    <a href="#/">Home</a> | <a href="#/1">Page 1</a> | <a href="#/2">Page 2</a>
  </div>
  <hr />
  <div class="alert alert-block alert-{{flash.get().type}}" ng-show="flash.get().body">
    <h4>{{flash.get().title}}</h4>
    <p>{{flash.get().body}}</p>
  </div>
  <div class="container" ng-view></div>
  <hr />
  <label>Message Title</label>
  <input ng-model="msgTitle" placeholder="Title"><br />
  <label>Message Body</label>
  <input ng-model="msgBody" placeholder="Body"><br />
  <label>Message Type</label>
  <select ng-model="msgType">
    <option value="success">Success</option>
    <option value="info">Info</option>
    <option value="warning">Warning</option>
    <option value="error">Error</option>
  </select><br />
  <hr />
  <a ng-click="flash.set({title: msgTitle, body: msgBody, type: msgType})" class="btn">
    Set flash to display on next page
  </a>
  <br>
  <a ng-click="flash.pop({title: msgTitle, body: msgBody, type: msgType})" class="btn">Pop flash up immediately (Growl Style)</a>
</body> 
</html>
/**
 * Contents of https://raw.github.com/CodeSeven/toastr/master/toastr.css
 *
 * plunker wouldn't load it from github properly.
 */
.toast-title
{
    font-weight: bold;
}

.toast-message
{
    -ms-word-wrap: break-word;
    word-wrap: break-word;
}

    .toast-message a,
    .toast-message label
    {
        color: #FFF;
    }

        .toast-message a:hover
        {
            color: #CCC;
            text-decoration: none;
        }

.toast-top-left
{
    left: 12px;
    top: 12px;
}

.toast-bottom-right
{
    bottom: 12px;
    right: 12px;
}

.toast-bottom-left
{
    bottom: 12px;
    left: 12px;
}

#toast-container
{
    position: fixed;
    z-index: 9999;
}

    #toast-container > div
    {
        background-position: 15px center;
        background-repeat: no-repeat;
        -moz-border-radius: 3px 3px 3px 3px;
        -webkit-border-radius: 3px 3px 3px 3px;
        border-radius: 3px 3px 3px 3px;
        -moz-box-shadow: 0 0 12px #999999;
        -webkit-box-shadow: 0 0 12px #999999;
        box-shadow: 0 0 12px #999999;
        color: #FFFFFF;
        -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";
        filter: alpha(opacity=80);
        margin: 0 0 6px;
        opacity: 0.8;
        padding: 15px 15px 15px 50px;
        width: 300px;
    }

.toast
{
    background-color: #030303;
}

.toast-success
{
    background-color: #51A351;
}

.toast-error
{
    background-color: #BD362F;
}

.toast-info
{
    background-color: #2F96B4;
}

.toast-warning
{
    background-color: #F89406;
}

.toast-top-right
{
    right: 12px;
    top: 12px;
}

#toast-container > :hover
{
    -moz-box-shadow: 0 0 12px #000000;
    -webkit-box-shadow: 0 0 12px #000000;
    box-shadow: 0 0 12px #000000;
    cursor: pointer;
    -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
    filter: alpha(opacity=100);
    opacity: 1;
}

#toast-container > .toast-info
{
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=") !important;
}

#toast-container > .toast-error
{
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=") !important;
}

#toast-container > .toast-success
{
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==") !important;
}

#toast-container > .toast-warning
{
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=") !important;
}

/*Responsive Design*/

@media all and (max-width: 240px)
{
    #toast-container > div
    {
        padding: 8px 8px 8px 50px;
        width: 108px;
    }
}

@media all and (min-width: 241px) and (max-width: 320px)
{
    #toast-container > div
    {
        padding: 8px 8px 8px 50px;
        width: 128px;
    }
}

@media all and (min-width: 321px) and (max-width: 480px)
{
    #toast-container > div
    {
        padding: 8px 8px 8px 50px;
        width: 192px;
    }
}

@media all and (min-width: 481px) and (max-width: 768px)
{
    #toast-container > div
    {
        padding: 15px 15px 15px 50px;
        width: 300px;
    }
}

@media all and (min-width: 769px)
{
    #toast-container > div
    {
        padding: 15px 15px 15px 50px;
        width: 300px;
    }
}