With the use of sachinchoolur's angularjs-flash module I want to add flash messages to my application.
The flash messages are working with my setup, but they don't disappear.
In the documentation it says to add a Time Out with a FlashProvider in the app's configuration.
I am trying to do this but whenever I inject the FlashProvider, my AngularJs logic stops working (all logic).
FlashProvider from the 3rd party module: angular-flash.min.js
app.provider('Flash', function () {
var defaultConfig = {};
var templatePresets = {
bootstrap: {
html: '\n <div role="alert" id="{{flash.config.id}}"\n class="alert {{flash.config.class}} alert-{{flash.type}} alert-dismissible alertIn alertOut">\n <div type="button" class="close" ng-show="flash.showClose" close-flash="{{flash.id}}">\n <span aria-hidden="true">×</span>\n <span class="sr-only">Close</span>\n </div>\n <span dynamic="flash.text"></span>\n </div>',
transclude: false
},
transclude: {
html: '<div applytransclude></div>',
transclude: true
}
};
this.setTimeout = function (timeout) {
if (typeof timeout !== 'number') return;
defaultConfig.timeout = timeout;
};
this.setShowClose = function (value) {
if (typeof value !== 'boolean') return;
defaultConfig.showClose = value;
};
this.setTemplate = function (template) {
if (typeof template !== 'string') return;
defaultConfig.template = template;
};
this.setTemplatePreset = function (preset) {
if (typeof preset !== 'string' || !(preset in templatePresets)) return;
var template = templatePresets[preset];
this.setTemplate(template.html);
defaultConfig.templateTransclude = template.transclude;
};
this.setOnDismiss = function (callback) {
if (typeof callback !== 'function') return;
defaultConfig.onDismiss = callback;
};
this.setTimeout(5000);
this.setShowClose(true);
this.setTemplatePreset('bootstrap');
this.$get = ['$rootScope', '$timeout', function ($rootScope, $timeout) {
var dataFactory = {};
var counter = 0;
dataFactory.setTimeout = this.setTimeout;
dataFactory.setShowClose = this.setShowClose;
dataFactory.setOnDismiss = this.setOnDismiss;
dataFactory.config = defaultConfig;
dataFactory.create = function (type, text, timeout, config, showClose) {
if (!text) return false;
var $this = void 0,
flash = void 0;
$this = this;
flash = {
type: type,
text: text,
config: config,
id: counter++
};
flash.showClose = typeof showClose !== 'undefined' ? showClose : defaultConfig.showClose;
if (defaultConfig.timeout && typeof timeout === 'undefined') {
flash.timeout = defaultConfig.timeout;
} else if (timeout) {
flash.timeout = timeout;
}
$rootScope.flashes.push(flash);
if (flash.timeout) {
flash.timeoutObj = $timeout(function () {
$this.dismiss(flash.id);
}, flash.timeout);
}
return flash.id;
};
dataFactory.pause = function (index) {
if ($rootScope.flashes[index].timeoutObj) {
$timeout.cancel($rootScope.flashes[index].timeoutObj);
}
};
dataFactory.dismiss = function (id) {
var index = findIndexById(id);
if (index !== -1) {
var flash = $rootScope.flashes[index];
dataFactory.pause(index);
$rootScope.flashes.splice(index, 1);
if (typeof defaultConfig.onDismiss === 'function') {
defaultConfig.onDismiss(flash);
}
}
};
dataFactory.clear = function () {
while ($rootScope.flashes.length > 0) {
dataFactory.dismiss($rootScope.flashes[0].id);
}
};
dataFactory.reset = dataFactory.clear;
function findIndexById(id) {
return $rootScope.flashes.map(function (flash) {
return flash.id;
}).indexOf(id);
}
return dataFactory;
}];
});
My main module configuration
// public/js/app.js
angular.module('myApp', [
'ngRoute',
'ngFlash',
'myApp.home',
'myApp.profile',
'myApp.login',
'myApp.signup'
])
.config(['$locationProvider', '$routeProvider', 'FlashProvider'
function($locationProvider, $routeProvider, $httpProvider, FlashProvider) {
$locationProvider.hashPrefix('!');
$routeProvider.otherwise({redirectTo: '/home'});
}]);
Javascript reference in the html file
<script src="bower_components/angular-flash-alert/dist/angular-flash.min.js"></script>
EDIT
According to the documentation to automatically disappear the flashes after a certain amount of time I did this, but they still don't disappear.
html file
<flash-message duration="5000"></flash-message>
config file
.config(['$locationProvider', '$routeProvider', '$httpProvider', 'FlashProvider',
function($locationProvider, $routeProvider, $httpProvider, FlashProvider) {
FlashProvider.setTimeout(5000);
Duh! The injections are not in order! You had missed $httpProvider
. It actually meant FlashProvider
was injected as $httpProvider
:)
Your config should be like this. And if everything else is in place, this should make it work
.config(['$locationProvider', '$routeProvider', '$httpProvider', 'FlashProvider'
//---------------------------------------------^^^
function($locationProvider, $routeProvider, $httpProvider, FlashProvider) {
$locationProvider.hashPrefix('!');
$routeProvider.otherwise({redirectTo: '/home'});
}]);