One way to do this might be to create a Service and inject it into each of the controllers, create a function called register which takes a promise pushes it into an array within the service. You could then listen for when all promises are resolved, and load the page.
I would imagine you would need some sort of basic timer promise as well to solve the edge case at the beginning of page load, when the controllers have yet to register their promises.
Within the controllers you would register your promise for the entire controller, or for individual functions, that is up to you, I would create 1 promise per controller with var deferred = $q.defer() Scheduler.register(deferred.promise), then resolve deferred when all other promises had been resolved.
Here's a simple example: http://jsfiddle.net/4mf1pkLj/62/
$window.ready() is called when all promises are resolved within scheduler
.controller('OtherCtrl', ['$scope', '$q', 'scheduler',
function($scope, $q, scheduler) {
var differed = $q.defer()
$scope.state = "waiting"
//do some blocking ajaxy thing
setTimeout(function() {
differed.resolve()
$scope.state = "ready"
}, 5000);
scheduler.register(differed.promise)
}
])
.service('scheduler', ['$http', '$q', '$window',
function($http, $q, $window) {
var promises = [];
var finished = $q.defer().promise
this.register = function(promise) {
promises.push(promise)
finished = wait()
}
function wait() {
return $q.all(promises)
}
function listen() {
finished.then(function() {
//render your content
$window.ready()
})
}
//wait until everything is registered
setTimeout(function(){listen()},200)
}