Angular: Empty Fiddle
http://angularjs.org/
HTML
<script src="http://code.angularjs.org/angular-1.0.1.js"></script>
<div ng-controller="MainController">
<ul>
<li ng-repeat="text in texts">{{text.data}}</li>
</ul>
<button ng-click="buttonClick()">Load a new delayed text</button>
<div class="loading-widget">Loading...</div>
<div>Pending requests: {{count()}}</div>
</div>
JavaScript
angular.module('myApp', [
'myApp.services',
'myApp.directives',
'myApp.controllers'])
.config(function (
$httpProvider,
requestNotificationProvider) {
$httpProvider.defaults.transformRequest.push(function (data) {
requestNotificationProvider.fireRequestStarted(data);
return data;
});
$httpProvider.defaults.transformResponse.push(function (data) {
requestNotificationProvider.fireRequestEnded(data);
return data;
});
});
angular.module('myApp.controllers', []).controller("MainController", function ($scope, $http, requestNotification) {
$scope.texts = [];
$scope.count = requestNotification.getRequestCount;
$scope.buttonClick = function () {
$http.get("http://slowapi.com/delay/1.0").then(function (response) {
$scope.texts.push(response);
}, function (response) {
var d = new Date();
$scope.texts.push({
data: "Request failed!"
});
});
};
});
angular.module('myApp.services', []).provider(
'requestNotification', function () {
// This is where we keep subscribed listeners
var onRequestStartedListeners = [];
var onRequestEndedListeners = [];
// This is a utility to easily increment the request count
var count = 0;
var requestCounter = {
increment: function () {
count++;
},
decrement: function () {
if (count > 0) count--;
},
getCount: function () {
return count;
}
};
// Subscribe to be notified when request starts
this.subscribeOnRequestStarted = function (listener) {
onRequestStartedListeners.push(listener);
};
// Tell the provider, that the request has started.
this.fireRequestStarted = function (request) {
// Increment the request count
requestCounter.increment();
//run each subscribed listener
...