Last active
August 29, 2015 14:10
-
-
Save deborasetton/72f0b52b6758588ceec8 to your computer and use it in GitHub Desktop.
Demo for AngularJS-Toaster issue with scopes
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!DOCTYPE html> | |
| <html ng-app='DemoApp'> | |
| <head> | |
| <title></title> | |
| <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular.min.js" ></script> | |
| <script src="http://code.angularjs.org/1.2.0/angular-animate.min.js" ></script> | |
| <script type="text/javascript" src='toaster.js'></script> | |
| <link rel="stylesheet" href="toaster.css"></link> | |
| <script type="text/javascript"> | |
| angular.module('DemoApp', ['toaster']); | |
| angular.module('DemoApp').controller('demoCtrl', function($scope, toaster) { | |
| // Calling toaster via the button always works. | |
| $scope.pop = function(){ | |
| toaster.pop('success', "title", "text"); | |
| }; | |
| // Calling toaster via a global variable only works if the workaround | |
| // is set via the 'use-workaround' option (see HTML below). | |
| window._toaster = toaster; | |
| setTimeout(function () { | |
| console.debug('Calling toaster'); | |
| _toaster.pop('success', "title", "text"); | |
| }, 1000); | |
| }); | |
| </script> | |
| </head> | |
| <body ng-controller='demoCtrl'> | |
| <toaster-container toaster-options="{'use-workaround': false}"></toaster-container> | |
| <button ng-click="pop()">Show a Toaster</button> | |
| </body> | |
| </html> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /* | |
| * Toastr | |
| * Version 2.0.1 | |
| * 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 | |
| */ | |
| .toast-title { | |
| font-weight: bold; | |
| } | |
| .toast-message { | |
| -ms-word-wrap: break-word; | |
| word-wrap: break-word; | |
| } | |
| .toast-message a, | |
| .toast-message label { | |
| color: #ffffff; | |
| } | |
| .toast-message a:hover { | |
| color: #cccccc; | |
| text-decoration: none; | |
| } | |
| .toast-close-button { | |
| position: relative; | |
| right: -0.3em; | |
| top: -0.3em; | |
| float: right; | |
| font-size: 20px; | |
| font-weight: bold; | |
| color: #ffffff; | |
| -webkit-text-shadow: 0 1px 0 #ffffff; | |
| text-shadow: 0 1px 0 #ffffff; | |
| opacity: 0.8; | |
| -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80); | |
| filter: alpha(opacity=80); | |
| } | |
| .toast-close-button:hover, | |
| .toast-close-button:focus { | |
| color: #000000; | |
| text-decoration: none; | |
| cursor: pointer; | |
| opacity: 0.4; | |
| -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40); | |
| filter: alpha(opacity=40); | |
| } | |
| /*Additional properties for button version | |
| iOS requires the button element instead of an anchor tag. | |
| If you want the anchor version, it requires `href="#"`.*/ | |
| button.toast-close-button { | |
| padding: 0; | |
| cursor: pointer; | |
| background: transparent; | |
| border: 0; | |
| -webkit-appearance: none; | |
| } | |
| .toast-top-full-width { | |
| top: 0; | |
| right: 0; | |
| width: 100%; | |
| } | |
| .toast-bottom-full-width { | |
| bottom: 0; | |
| right: 0; | |
| width: 100%; | |
| } | |
| .toast-top-left { | |
| top: 12px; | |
| left: 12px; | |
| } | |
| .toast-top-center { | |
| top: 12px; | |
| } | |
| .toast-top-right { | |
| top: 12px; | |
| right: 12px; | |
| } | |
| .toast-bottom-right { | |
| right: 12px; | |
| bottom: 12px; | |
| } | |
| .toast-bottom-center { | |
| bottom: 12px; | |
| } | |
| .toast-bottom-left { | |
| bottom: 12px; | |
| left: 12px; | |
| } | |
| .toast-center { | |
| top: 45%; | |
| } | |
| #toast-container { | |
| position: fixed; | |
| z-index: 999999; | |
| /*overrides*/ | |
| } | |
| #toast-container.toast-center, | |
| #toast-container.toast-top-center, | |
| #toast-container.toast-bottom-center{ | |
| width: 100%; | |
| } | |
| #toast-container.toast-center > div, | |
| #toast-container.toast-top-center > div, | |
| #toast-container.toast-bottom-center > div{ | |
| margin: auto; | |
| } | |
| #toast-container * { | |
| -moz-box-sizing: border-box; | |
| -webkit-box-sizing: border-box; | |
| box-sizing: border-box; | |
| } | |
| #toast-container > div { | |
| margin: 0 0 6px; | |
| padding: 15px 15px 15px 50px; | |
| width: 300px; | |
| -moz-border-radius: 3px 3px 3px 3px; | |
| -webkit-border-radius: 3px 3px 3px 3px; | |
| border-radius: 3px 3px 3px 3px; | |
| background-position: 15px center; | |
| background-repeat: no-repeat; | |
| -moz-box-shadow: 0 0 12px #999999; | |
| -webkit-box-shadow: 0 0 12px #999999; | |
| box-shadow: 0 0 12px #999999; | |
| color: #ffffff; | |
| opacity: 0.8; | |
| -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80); | |
| filter: alpha(opacity=80); | |
| } | |
| #toast-container > :hover { | |
| -moz-box-shadow: 0 0 12px #000000; | |
| -webkit-box-shadow: 0 0 12px #000000; | |
| box-shadow: 0 0 12px #000000; | |
| opacity: 1; | |
| -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100); | |
| filter: alpha(opacity=100); | |
| cursor: pointer; | |
| } | |
| #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-wait { | |
| background-image: url("data:image/gif;base64,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") !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; | |
| } | |
| #toast-container.toast-top-full-width > div, | |
| #toast-container.toast-bottom-full-width > div { | |
| width: 96%; | |
| margin: auto; | |
| } | |
| .toast { | |
| background-color: #030303; | |
| } | |
| .toast-success { | |
| background-color: #51a351; | |
| } | |
| .toast-error { | |
| background-color: #bd362f; | |
| } | |
| .toast-info { | |
| background-color: #2f96b4; | |
| } | |
| .toast-wait { | |
| background-color: #2f96b4; | |
| } | |
| .toast-warning { | |
| background-color: #f89406; | |
| } | |
| /*Responsive Design*/ | |
| @media all and (max-width: 240px) { | |
| #toast-container > div { | |
| padding: 8px 8px 8px 50px; | |
| width: 11em; | |
| } | |
| #toast-container .toast-close-button { | |
| right: -0.2em; | |
| top: -0.2em; | |
| } | |
| } | |
| @media all and (min-width: 241px) and (max-width: 480px) { | |
| #toast-container > div { | |
| padding: 8px 8px 8px 50px; | |
| width: 18em; | |
| } | |
| #toast-container .toast-close-button { | |
| right: -0.2em; | |
| top: -0.2em; | |
| } | |
| } | |
| @media all and (min-width: 481px) and (max-width: 768px) { | |
| #toast-container > div { | |
| padding: 15px 15px 15px 50px; | |
| width: 25em; | |
| } | |
| } | |
| /* | |
| * AngularJS-Toaster | |
| * Version 0.3 | |
| */ | |
| :not(.no-enter)#toast-container > div.ng-enter, | |
| :not(.no-leave)#toast-container > div.ng-leave | |
| { | |
| -webkit-transition: 1000ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all; | |
| -moz-transition: 1000ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all; | |
| -ms-transition: 1000ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all; | |
| -o-transition: 1000ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all; | |
| transition: 1000ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all; | |
| } | |
| :not(.no-enter)#toast-container > div.ng-enter.ng-enter-active, | |
| :not(.no-leave)#toast-container > div.ng-leave { | |
| opacity: 0.8; | |
| } | |
| :not(.no-leave)#toast-container > div.ng-leave.ng-leave-active, | |
| :not(.no-enter)#toast-container > div.ng-enter { | |
| opacity: 0; | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| (function () { | |
| 'use strict'; | |
| /* | |
| * AngularJS Toaster | |
| * Version: 0.4.9 | |
| * | |
| * Copyright 2013 Jiri Kavulak. | |
| * 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: Jiri Kavulak | |
| * Related to project of John Papa and Hans Fjällemark | |
| */ | |
| angular.module('toaster', ['ngAnimate']) | |
| .service('toaster', ['$rootScope', function ($rootScope) { | |
| this.pop = function (type, title, body, timeout, bodyOutputType, clickHandler) { | |
| if (angular.isObject(type)) { | |
| var params = type; // NOTE: anable parameters as pop argument | |
| this.toast = { | |
| type: params.type, | |
| title: params.title, | |
| body: params.body, | |
| timeout: params.timeout, | |
| bodyOutputType: params.bodyOutputType, | |
| clickHandler: params.clickHandler | |
| }; | |
| } | |
| else { | |
| this.toast = { | |
| type: type, | |
| title: title, | |
| body: body, | |
| timeout: timeout, | |
| bodyOutputType: bodyOutputType, | |
| clickHandler: clickHandler | |
| }; | |
| } | |
| $rootScope.$emit('toaster-newToast'); | |
| }; | |
| this.clear = function () { | |
| $rootScope.$emit('toaster-clearToasts'); | |
| }; | |
| }]) | |
| .constant('toasterConfig', { | |
| 'limit': 0, // limits max number of toasts | |
| 'tap-to-dismiss': true, | |
| 'close-button': false, | |
| 'newest-on-top': true, | |
| //'fade-in': 1000, // done in css | |
| //'on-fade-in': undefined, // not implemented | |
| //'fade-out': 1000, // done in css | |
| // 'on-fade-out': undefined, // not implemented | |
| //'extended-time-out': 1000, // not implemented | |
| 'time-out': 5000, // Set timeOut and extendedTimeout to 0 to make it sticky | |
| 'icon-classes': { | |
| error: 'toast-error', | |
| info: 'toast-info', | |
| wait: 'toast-wait', | |
| success: 'toast-success', | |
| warning: 'toast-warning' | |
| }, | |
| 'body-output-type': '', // Options: '', 'trustedHtml', 'template' | |
| 'body-template': 'toasterBodyTmpl.html', | |
| 'icon-class': 'toast-info', | |
| 'position-class': 'toast-top-right', | |
| 'title-class': 'toast-title', | |
| 'message-class': 'toast-message' | |
| }) | |
| .directive('toasterContainer', ['$compile', '$rootScope', '$interval', '$sce', '$timeout', 'toasterConfig', 'toaster', | |
| function ($compile, $rootScope, $interval, $sce, $timeout, toasterConfig, toaster) { | |
| return { | |
| replace: true, | |
| restrict: 'EA', | |
| scope: true, // creates an internal scope for this directive | |
| link: function (scope, elm, attrs) { | |
| var id = 0, | |
| mergedConfig; | |
| mergedConfig = angular.extend({}, toasterConfig, scope.$eval(attrs.toasterOptions)); | |
| scope.config = { | |
| position: mergedConfig['position-class'], | |
| title: mergedConfig['title-class'], | |
| message: mergedConfig['message-class'], | |
| tap: mergedConfig['tap-to-dismiss'], | |
| closeButton: mergedConfig['close-button'], | |
| animation: mergedConfig['animation-class'] | |
| }; | |
| scope.configureTimer = function configureTimer(toast) { | |
| var timeout = typeof (toast.timeout) == "number" ? toast.timeout : mergedConfig['time-out']; | |
| if (timeout > 0) | |
| setTimeout(toast, timeout); | |
| }; | |
| function addToast(toast) { | |
| if (mergedConfig['use-workaround']) { | |
| $timeout(function () { | |
| console.debug('Workaround in place!'); | |
| }); | |
| } | |
| toast.type = mergedConfig['icon-classes'][toast.type]; | |
| if (!toast.type) | |
| toast.type = mergedConfig['icon-class']; | |
| id++; | |
| angular.extend(toast, { id: id }); | |
| // Set the toast.bodyOutputType to the default if it isn't set | |
| toast.bodyOutputType = toast.bodyOutputType || mergedConfig['body-output-type']; | |
| switch (toast.bodyOutputType) { | |
| case 'trustedHtml': | |
| toast.html = $sce.trustAsHtml(toast.body); | |
| break; | |
| case 'template': | |
| toast.bodyTemplate = toast.body || mergedConfig['body-template']; | |
| break; | |
| } | |
| scope.configureTimer(toast); | |
| if (mergedConfig['newest-on-top'] === true) { | |
| scope.toasters.unshift(toast); | |
| if (mergedConfig['limit'] > 0 && scope.toasters.length > mergedConfig['limit']) { | |
| scope.toasters.pop(); | |
| } | |
| } else { | |
| scope.toasters.push(toast); | |
| if (mergedConfig['limit'] > 0 && scope.toasters.length > mergedConfig['limit']) { | |
| scope.toasters.shift(); | |
| } | |
| } | |
| } | |
| function setTimeout(toast, time) { | |
| toast.timeout = $interval(function () { | |
| scope.removeToast(toast.id); | |
| }, time); | |
| } | |
| scope.toasters = []; | |
| $rootScope.$on('toaster-newToast', function () { | |
| addToast(toaster.toast); | |
| }); | |
| $rootScope.$on('toaster-clearToasts', function () { | |
| scope.toasters.splice(0, scope.toasters.length); | |
| }); | |
| }, | |
| controller: ['$scope', '$element', '$attrs', function ($scope, $element, $attrs) { | |
| $scope.stopTimer = function (toast) { | |
| if (toast.timeout) { | |
| $interval.cancel(toast.timeout); | |
| toast.timeout = null; | |
| } | |
| }; | |
| $scope.restartTimer = function (toast) { | |
| if (!toast.timeout) | |
| $scope.configureTimer(toast); | |
| }; | |
| $scope.removeToast = function (id) { | |
| var i = 0; | |
| for (i; i < $scope.toasters.length; i++) { | |
| if ($scope.toasters[i].id === id) | |
| break; | |
| } | |
| $scope.toasters.splice(i, 1); | |
| }; | |
| $scope.click = function (toaster, isCloseButton) { | |
| if ($scope.config.tap === true) { | |
| var removeToast = true; | |
| if (toaster.clickHandler) { | |
| if (angular.isFunction(toaster.clickHandler)) { | |
| removeToast = toaster.clickHandler(toaster, isCloseButton); | |
| } | |
| else if (angular.isFunction($scope.$parent.$eval(toaster.clickHandler))) { | |
| removeToast = $scope.$parent.$eval(toaster.clickHandler)(toaster, isCloseButton); | |
| } | |
| else { | |
| console.log("TOAST-NOTE: Your click handler is not inside a parent scope of toaster-container."); | |
| } | |
| } | |
| if (removeToast) { | |
| $scope.removeToast(toaster.id); | |
| } | |
| } | |
| }; | |
| }], | |
| template: | |
| '<div id="toast-container" ng-class="[config.position, config.animation]">' + | |
| '<div ng-repeat="toaster in toasters" class="toast" ng-class="toaster.type" ng-click="click(toaster)" ng-mouseover="stopTimer(toaster)" ng-mouseout="restartTimer(toaster)">' + | |
| '<button class="toast-close-button" ng-show="config.closeButton" ng-click="click(toaster, true)">×</button>' + | |
| '<div ng-class="config.title">{{toaster.title}}</div>' + | |
| '<div ng-class="config.message" ng-switch on="toaster.bodyOutputType">' + | |
| '<div ng-switch-when="trustedHtml" ng-bind-html="toaster.html"></div>' + | |
| '<div ng-switch-when="template"><div ng-include="toaster.bodyTemplate"></div></div>' + | |
| '<div ng-switch-default >{{toaster.body}}</div>' + | |
| '</div>' + | |
| '</div>' + | |
| '</div>' | |
| }; | |
| }]); | |
| })(window, document); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment