FrAngular services

HTML

<div ng-app="app" ng-controller="Ctrl">
  <h2>{{title}}</h2>

  <ul>
    <li ng-repeat='year in yearsWithLabel'>{{year}}</li>
  </ul>

  <div>Release : {{release}} - Author : {{author}}</div>
</div>

CSS

h2 {
  font-size: 1.4em;
  font-weight: bold;
}

ul {
  margin: 1em;
}

JavaScript

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

app.config(['Author', 'LabelServiceProvider', function(Author, LabelServiceProvider) {
  Author.init('Thierry Chatel');
  LabelServiceProvider.init('Year');
}]);

app.controller('Ctrl', ['$scope', 'Info', 'Release', 'Author', 'LabelService', function($scope, Info, Release, Author, LabelService) {
  $scope.title = Info.title;
  $scope.release = Release;
  $scope.author = Author.get();
  $scope.yearsWithLabel = LabelService.getYearsWithLabel();
}]);

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

services.value('Info', {
  title: 'Services Demo',
  version: '1.0',
  dataSize: 10
});

services.value('AppUtils', {
  trim: function(text) {
    return typeof text == 'string' ? text.replace(/^\s*/, '').replace(/\s*$/, '') : text;
  },
  endsWith: function(text, suffix) {
    return text.indexOf(suffix, text.length - suffix.length) !== -1;
  }
});

services.factory('Release', ['Info', 'AppUtils', function(Info, AppUtils) {
  var release = Info.version +
    (AppUtils.endsWith(Info.version, '.0') ?
      ' (major release)' :
      ' (minor release)');
  return release;
}]);

function Data(Info) {
  this.years = [];
  for (var i = 0; i < Info.dataSize; i++) {
    this.years.push(2013 - i);
  }
}
Data.prototype.getYears = function() {
  return this.years;
};
services.service('Data', ['Info', Data]);

services.provider('LabelService', function() {
  var label;
  this.init = function(txt) {
    label = txt;
  };
  // Service factory method, with dependancy injection
  this.$get = ['Data', function(Data) {
    var yearsWithLabel = [];
    angular.forEach(Data.getYears(), function(value, key) {
      yearsWithLabel.push(label + ' ' + value);
    });
    // Returns the service object
    return {
      getYearsWithLabel: function(value) {
        return yearsWithLabel;
      }
    };
  }];
});

services.constant('Author', {
  author: 'unknown',
  init: function(author) {
    this.author = author;
  },
  get: function() {
   ...