Czy w JavaScript można policzyć liczbę zegarków kątowych na całej stronie?
Używamy Batarangu , ale nie zawsze odpowiada to naszym potrzebom. Nasza aplikacja jest duża i jesteśmy zainteresowani wykorzystaniem testów automatycznych, aby sprawdzić, czy liczba zegarków nie rośnie zbytnio.
Przydatne byłoby również liczenie zegarków na podstawie liczby kontrolerów.
Edycja : oto moja próba. Liczy zegarki we wszystkim z klasą 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
ma tablicę obserwatorów $$ z liczbą obserwatorów na tym kontrolerze (cóż, jeśli masz jakieś powtórzenie ng lub coś, co tworzy inny zakres, to nie działa tak dobrze). Ale myślę, że nie ma sposobu, aby zobaczyć wszystkie zegarki w całej aplikacji.Odpowiedzi:
(Może zajść potrzeba zmiany
body
nahtml
lub w dowolnym miejscung-app
)Dzięki Erilemowi za wskazanie tej odpowiedzi brakowało
$isolateScope
wyszukiwania, a obserwatorzy potencjalnie zostali zduplikowani w swojej odpowiedzi / komentarzu.Podziękowania dla Ben2307 za wskazanie, że
'body'
może to wymagać zmiany.Oryginalny
Zrobiłem to samo, ale sprawdziłem atrybut danych elementu HTML, a nie jego klasę. Twój sprawdziłem tutaj:
http://fluid.ie/
I dostałem 83. Sprawdziłem swój i uzyskałem 121.
Umieściłem też to w swoim:
I nic nie zostało wydrukowane, więc domyślam się, że mój jest lepszy (w tym, że znalazł więcej zegarków) - ale brakuje mi dogłębnej wiedzy o kątach, aby wiedzieć na pewno, że mój nie jest właściwym podzbiorem zestawu rozwiązań.
źródło
$scope
i$$watcher
automatycznego elementu jest czyszczone , czy też występuje spadek wydajności, który powoduje?$compileProvider.debugInfoEnabled(false);
w swoim projekcie, ten fragment będzie liczyć zero obserwatorów.Myślę, że wspomniane podejścia są niedokładne, ponieważ liczą obserwatorów w tym samym teleskopie podwójnie. Oto moja wersja bookmarkletu:
https://gist.github.com/DTFagus/3966db108a578f2eb00d
Pokazuje również więcej szczegółów dotyczących analizy obserwatorów.
źródło
Oto hackerskie rozwiązanie, które stworzyłem na podstawie inspekcji struktur zakresu. Wydaje się, że działa. Nie jestem pewien, jak dokładne jest to i na pewno zależy to od jakiegoś wewnętrznego interfejsu API. Używam angularjs 1.0.5.
źródło
$rootScope.$new(true)
lub$scope.$new(true)
, gdzie$scope
jest dla kontrolera, przechodzenie po hierarchii nadal znajduje ten zakres. Myślę, że oznacza to, że prototypy nie są połączone zamiast tego, że zakres nie znajduje się w hierarchii.Dostępna jest nowa wtyczka do Chrome, która automatycznie pokazuje aktualną całkowitą liczbę obserwatorów i ostatnią zmianę (+/-) w dowolnym momencie w aplikacji ... to po prostu niesamowite.
https://chrome.google.com/webstore/detail/angular-watchers/nlmjblobloedpmkmmckeehnbfalnjnjk
źródło
Ponieważ ostatnio zmagałem się z dużą liczbą obserwatorów w mojej aplikacji, odkryłem świetną bibliotekę o nazwie ng-stats - https://github.com/kentcdodds/ng-stats . Ma minimalną konfigurację i podaje liczbę obserwatorów na bieżącej stronie + długość cyklu podsumowania. Może również wyświetlać mały wykres w czasie rzeczywistym.
źródło
Niewielkie ulepszenie odpowiedzi Słów takich jak Jared .
źródło
W AngularJS 1.3.2
countWatchers
do modułu ngMock dodano metodę:Bibliografia
Dziennik zmian AngularJS: 1.3.2
ngMock: $ rootScope.Scope. $ countWatchers
źródło
angular.element(document)
naangular.element('[ng-app]')
i umieściłem go w bookmarkletu z ostrzeżeniem:alert('found ' + countWatchers() + ' watchers');
Poniższy kod wziąłem bezpośrednio z
$digest
samej funkcji. Oczywiście prawdopodobnie będziesz musiał zaktualizować selektor elementu aplikacji (document.body
) na dole.źródło
Oto funkcje, których używam:
Ta funkcja używa skrótu, aby nie liczyć wielokrotnie tego samego zakresu.
źródło
element.data()
czasami może być niezdefiniowany lub coś w tym stylu (przynajmniej w aplikacji 1.0.5, w której wystąpił błąd, gdy uruchomiłem to wycięte i próbowałem wywołaćcountWatchers
). Po prostu FYI.Istnieje funkcja rekurencyjna opublikowana na blogu Larsa Eidnesa pod adresem http://larseidnes.com/2014/11/05/angularjs-the-bad-parts/, która zbiera całkowitą liczbę obserwatorów. Porównuję wynik za pomocą zamieszczonej tutaj funkcji i tej, którą zamieścił na swoim blogu, który wygenerował nieco większą liczbę. Nie mogę powiedzieć, który z nich jest dokładniejszy. Właśnie dodane tutaj jako odniesienie.
UWAGA: możesz potrzebować zmienić „ng-app” na „data-ng-app” dla swojej aplikacji Angular.
źródło
Odpowiedź Plantiana jest szybsza: https://stackoverflow.com/a/18539624/258482
Oto funkcja, którą napisałem ręcznie. Nie myślałem o użyciu funkcji rekurencyjnych, ale zamiast tego zrobiłem to. Może być szczuplejsza, nie wiem.
Następnie umieść to w swoim najwyższym kontrolerze (jeśli używasz kontrolera globalnego).
I wreszcie zakładka:
źródło
Trochę za późno na to pytanie, ale używam tego
po prostu upewnij się, że używasz poprawnego querySelector.
źródło