<!DOCTYPE html>
<html>

<head>
  <link data-require="bootstrap-css@*" data-semver="3.0.3" rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css" />
  <script data-require="angular.js@*" data-semver="1.2.8" src="http://code.angularjs.org/1.2.8/angular.js"></script>
  <link rel="stylesheet" href="style.css" />
  <script src="script.js"></script>
</head>

<body ng-app="myApp">

  <div class="container">
    <div class="row">
      <h1>AngularJS digest completed event</h1>
      <p>
        http://stackoverflow.com/questions/21138388/angular-js-identify-an-digest-complete-event-and-removing-from-url-in-angular#21138524
      </p>
      <p>See console output.</p>
    </div>
    <div class="row">
    
      
      <div ng-controller="MyController">
        
        <button class="btn btn-default" ng-click="triggerDigest()">Trigger</button>
        <label>
          <input type="checkbox" ng-model="queueSubDigest"/>
          Queue subdigest
        </label>
      </div>
    </div>
    
  </div>
  
</body>

</html>
// Code goes here

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

myApp.controller('MyController', function($scope, $timeout, $rootScope) {

  $scope.count = 0;
  $scope.subCount = 0;

  function postDigest(callback) {
    var unregister = $rootScope.$watch(function() {
      console.log('tick', Date.now());
      unregister();
      $timeout(function() {
        callback();
        postDigest(callback);
      }, 0, false);
    });
  }

  postDigest(function() {
    console.log('Post digest cycle', 'count ' + $scope.count + ' subcount ' + $scope.subCount);
  });

  /* Via $$postDigest */
  
  /* 
  
  var inDigest = false;

  $scope.$watch(function() {
    // Called at least one time on every digest cycle
    console.log('tick', Date.now());

    if(!inDigest) {

      inDigest = true;

      $scope.$$postDigest(function() {
        // Should be called once (even if digest queues another digest).

        console.log('Post digest cycle', 'count ' + $scope.count + ' subcount ' + $scope.subCount);

        // Do your post digest here.

        inDigest = false;
      });    
    }
  });
  
  */

  $scope.triggerDigest = function() {
    // Change a variable on the scope, which triggers the (re)digest cycle
    $scope.count += 1;
  };

  $scope.$watch('count', function(value) {
    console.log('watch count', $scope.count);

    if ($scope.queueSubDigest) {

      // Queue another digest (what happens if something in the digest
      // makes another change)

      console.log('Queueing another digest');

      $scope.subCount += 1;
    }
  });

  $scope.$watch('subCount', function(value) {
    console.log('watch subCount', $scope.subCount);
  });

});
/* Styles go here */