Angular 1.1.4 - Custom Provider

AngularJS 1.1.4 Includes jQuery http://stackoverflow.com/questions/16368066/angularjs-extending-module-with-own-types-providers

by dshilkret

HTML

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.1.4/angular.min.js"></script>
<div ng-app="myApp">
  <div ng-controller='MainController'>
    <div>
      <button ng-click='askName()'>Ask Name</button>
      <button ng-click='askNameAgain()'>Ask Name Again</button>
      <button ng-click='askAge()'>Ask Age</button>
      <button ng-click='askFood()'>Ask Food</button>
    </div>
    <div>{{lastResponse}}</div>
  </div>
</div>

JavaScript

// Base AngularJS 1.1.4 Fiddle + jQuery
// http://stackoverflow.com/questions/16368066/angularjs-extending-module-with-own-types-providers

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

// Provide some basic injectables for testing
app.constant('nameString', 'NAME');
app.constant('ageString', 'AGE');
app.constant('foodString', 'FAVORITE FOOD');

// Create the alert provider
app.provider('alert', function($provide, $injector) {
  var alerts = {};

  this.register = function(name, configFn) {
    // Create a new service
    $provide.factory(name, function($window, $q) {
     alerts[name] = function() {
        // Get data based on DI injected version of configFn
        var data = $injector.invoke(configFn);
        // faking async here since prompt is really synchronous
        var deferred = $q.defer();
        var response = $window.prompt(data.text);
        deferred.resolve(response);
        return deferred.promise;
      };
      return alerts[name];
    });
  };

  // Injecting the service itself gives you a function that
  // allows you to access a alert by name, much like $filter
  this.$get = function() {
    return function(name) {
      return alerts[name];
    };
  };
});

// Providing alert injectables via app.config
app.config(function(alertProvider) {
  alertProvider.register('askFood', function(foodString) {
    return { text: 'What is your ' + foodString + '?' }
  });
});

// Alternatively, shortcut to accessing the alertProvider via app.alert
app.alert = function(name, configFn) {
  app.config(function(alertProvider) {
    alertProvider.register(name, configFn);
  });
};
    
app.alert('askName', function(nameString) {
  return { text: 'What is your ' + nameString + '?' }
});

app.alert('askAge', function(ageString) {
  return { text: 'What is your ' + ageString + '?' }
});

app.controller('MainController',
               function($scope, askName, askAge, askFood, alert) {
  var setLastResponse = function(result) {
    $scope.lastResponse = result;
 ...