Zacznę od stwierdzenia, że to, co próbuję zrobić, prawdopodobnie nie jest uważane za dobrą praktykę. Jednak muszę zrobić coś takiego, aby przenieść dużą aplikację internetową do AngularJs w małych krokach.Kątowa: Czy można oglądać zmienną globalną (tj. Poza zakresem)?
Próbowałem robić
$scope.$watch(function() { return myVar; }, function (n, old) {
alert(n + ' ' + old);
});
Gdzie myVar jest zmienną globalną (zdefiniowanej w oknie)
, po czym zmień MyVar z konsoli. Ale wystrzeliwuje się tylko przy pierwszym ustawieniu obserwatora.
To działa, jeśli mogę zaktualizować MyVar od wewnątrz regulatora (patrz http://jsfiddle.net/rasmusvhansen/vsDXz/3/, ale jeśli nie jest aktualizowany od jakiegoś spuścizny javascript
Czy istnieje jakiś sposób, aby to osiągnąć?
Aktualizacja lubię Odpowiedź Andersa, jeśli kod źródłowy jest całkowicie poza zasięgiem, jednak obecnie patrzę na to podejście, które wydaje się działać i nie włącza timera w co sekundę:
// In legacy code when changing stuff
$('.angular-component').each(function() {
$(this).scope().$broadcast('changed');
});
// In angular
$scope.$on('changed', function() {
$scope.reactToChange();
});
Naliczam punkty dla Andersa, mimo że pójdę z innym rozwiązaniem, ponieważ jego rozwiązanie poprawnie rozwiązuje wskazany problem.
prawdopodobnie nie chce używać "każdego" do emisji, więc kątowy ma tylko jeden digest – charlietfl
W swoim przykładowym kodzie, na co wskazywał element '.angular-component'? – mlhDev
W moim przypadku wybrałem element, który faktycznie chciałem zmienić (używając 'angle.element (document.getElementById())' ponieważ nie używałem jQuery), a następnie nazwałem 'scope(). $ Broadcast ('customEventName'); '. Zauważ, że musiałem użyć '$ apply()' wewnątrz funkcji '$ on ('customEventName')', aby wywołać listę obserwatorów. –