Search code examples
angularjsflashdependency-injectionflash-message

Adding provider to config in AngularJs not working


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">&times;</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);

Solution

  • 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'});
    }]);