(function () { var head = document.getElementsByTagName('head')[0]; var styles = document.createElement('style'); styles.innerHTML = ` [data-watchers]:hover { outline: 1px dotted black; } [data-watchers]:hover:before { content: attr(data-watchers); outline: 1px dotted white; position: absolute; font-size: 10px; font-family: monospace; font-smooth: never; -webkit-font-smoothing: none; background-color: black; color: white; display: inline-block; height: 1em; line-height: 1em; z-index: 9999; } `; head.appendChild(styles); function annotateWatchers(elem) { elem = angular.element(elem); var selfWatchers = countWatchers(elem), totalWatchers = selfWatchers; angular.forEach(elem.children(), function(child) { totalWatchers += annotateWatchers(child); }); elem.attr('data-watchers', selfWatchers + ',' + totalWatchers); return totalWatchers; } function countWatchers(elem) { if (!elem || !elem.data) { return 0; } return countScopeWatchers(elem.data().$scope) + countScopeWatchers(elem.data().$isolateScope); } function countScopeWatchers(scope) { if (!scope || !scope.$$watchers) { return 0; } return scope.$$watchers.length; } annotateWatchers(document.documentElement); })();