Есть ли способ в JavaScript подсчитать количество угловых часов на всей странице?
Мы используем Батаранг , но он не всегда соответствует нашим потребностям. Наше приложение очень большое, и мы заинтересованы в использовании автоматических тестов, чтобы проверить, не увеличилось ли количество часов.
Также было бы полезно подсчитать количество часов для каждого контроллера.
Изменить : вот моя попытка. Считает часы во всем с классом ng-scope.
(function () {
var elts = document.getElementsByClassName('ng-scope');
var watches = [];
var visited_ids = {};
for (var i=0; i < elts.length; i++) {
var scope = angular.element(elts[i]).scope();
if (scope.$id in visited_ids)
continue;
visited_ids[scope.$id] = true;
watches.push.apply(watches, scope.$$watchers);
}
return watches.length;
})();
$scope
есть массив $$ watchers с количеством наблюдателей на этом контроллере (хорошо, если у вас есть какой-то ng-repeat или что-то, что создает другую область видимости, это не работает так хорошо). Но я думаю, что нет возможности увидеть все часы во всем приложении.Ответы:
(Вы , возможно , потребуется изменение
body
вhtml
или везде , где вы кладетеng-app
)Спасибо Эрилем за указание на то, что в этом ответе пропущен
$isolateScope
поиск, и наблюдатели потенциально дублируются в его / ее ответе / комментарии.Спасибо Ben2307 за указание на то, что,
'body'
возможно, потребуется изменить.оригинал
Я сделал то же самое, за исключением того, что проверил атрибут данных элемента HTML, а не его класс. Я управлял твоим здесь:
http://fluid.ie/
И получил 83. Я побежал мой и получил 121.
Я также положил это в свой:
И ничего не распечатано, так что я предполагаю, что мои лучше (в том, что они нашли больше часов) - но мне не хватает глубоких угловых знаний, чтобы точно знать, что мое не является надлежащим подмножеством набора решений.
источник
$scope
и$$watcher
автоматического режима или происходит снижение производительности?$compileProvider.debugInfoEnabled(false);
в своем проекте, этот фрагмент будет считать ноль наблюдателей.Я думаю, что упомянутые подходы неточны, так как они считают наблюдателей в одной области двойным. Вот моя версия букмарклета:
https://gist.github.com/DTFagus/3966db108a578f2eb00d
Это также показывает некоторые дополнительные детали для анализа наблюдателей.
источник
Вот хакерское решение, которое я собрал на основе проверки структур области видимости. Это, кажется, работает. Я не уверен, насколько это точно, и это определенно зависит от некоторого внутреннего API. Я использую angularjs 1.0.5.
источник
$rootScope.$new(true)
или$scope.$new(true)
, где$scope
находится для контроллера, то обход иерархии все еще находит эту область. Я думаю, что это означает, что прототипы не связаны, а не находится в иерархии.Существует новый плагин Chrome, который автоматически отображает текущее общее количество зрителей и последние изменения (+/-) в любое время в вашем приложении ... это просто потрясающе.
https://chrome.google.com/webstore/detail/angular-watchers/nlmjblobloedpmkmmckeehnbfalnjnjk
источник
Поскольку недавно я также боролся с большим количеством наблюдателей в своем приложении, я обнаружил замечательную библиотеку ng-stats - https://github.com/kentcdodds/ng-stats . Он имеет минимальные настройки и дает вам количество наблюдателей на текущей странице + продолжительность цикла дайджеста. Он также может проецировать небольшой график в реальном времени.
источник
Незначительное улучшение слов вроде ответа Джареда .
источник
В AngularJS 1.3.2
countWatchers
в модуль ngMock был добавлен метод:Ссылки
AngularJS Changelog: 1.3.2
ngMock: $ rootScope.Scope. $ countWatchers
источник
angular.element(document)
наangular.element('[ng-app]')
и поместил его в букмарклет с предупреждением:alert('found ' + countWatchers() + ' watchers');
Я взял код ниже непосредственно из самой
$digest
функции. Конечно, вам, вероятно, нужно обновить селектор элемента приложения (document.body
) внизу.источник
Это функции, которые я использую:
Эта функция использует хеш, чтобы не считать одну и ту же область видимости несколько раз.
источник
element.data()
иногда может быть неопределенным или что-то в этом роде (по крайней мере, в приложении 1.0.5, в котором я получил ошибку, когда запустил этот фрагмент и попытался вызватьcountWatchers
). Просто к вашему сведению.Существует рекурсивная функция, опубликованная в блоге Ларса Эйднеса по адресу http://larseidnes.com/2014/11/05/angularjs-the-bad-parts/ для сбора общего числа наблюдателей. Я сравниваю результат, используя функцию, опубликованную здесь, и функцию, опубликованную в его блоге, которая вызвала немного большее число. Я не могу сказать, какой из них является более точным. Просто добавлено здесь в качестве ссылки.
ПРИМЕЧАНИЕ: вам может потребоваться изменить «ng-app» на «data-ng-app» для вашего приложения Angular.
источник
Плантиан ответ быстрее: https://stackoverflow.com/a/18539624/258482
Вот функция, которую я написал от руки. Я не думал об использовании рекурсивных функций, но это то, что я сделал вместо этого. Это может быть скуднее, я не знаю.
Затем поместите это в ваш самый высокий контроллер (если вы используете глобальный контроллер).
И, наконец, книжный рынок:
источник
Немного опоздал на этот вопрос, но я этим пользуюсь
просто убедитесь, что вы используете правильный querySelector.
источник