Si vous voulez juste connaître la conclusion :
$scope.$watch($rootScope.xxx,function(newVal,oldVal){ //do something })
Quelqu'un a immédiatement demandé pourquoi pas :
$rootScope.$watch("xxx",function(newVal,oldVal){ //do something })
Laissez-moi vous expliquer pourquoi je devrais utiliser la première méthode d'un bug récent que j'ai rencontré.
La logique est celle indiquée sur la figure. Au début, j'ai utilisé la méthode d'écriture de $rootScope.$watch. Parce que la surveillance d'angularjs sur $rootScope est globalement valide une fois enregistrée. Et ma variable globale se trouve être des informations de commande, ce qui signifie que différents contrôleurs y ont apporté des modifications, et chaque changement déclenchera $rootScope.$watch pour entrer dans d'autres contrôleurs. Par analogie, $broadcast sur $rootScope démarrera globalement.
En fait, ce n'est pas le seul moyen. Il n'est pas difficile de trouver le code source de la méthode watch en vérifiant le code source angulaire, y compris le code suivant :
return function deregisterWatch() { if (arrayRemove(array, watcher) >= 0) { incrementWatchersCount(scope, -1); } lastDirtyWatch = null; };
Ce code nous indique que le nettoyage manuel de la montre est réalisable. Par exemple :
var watcher = $rootScope.$watch("xxx",function(){}); //手动清除 watcher watcher();
C’est quand même très simple, non ? La méthode ci-dessus peut également être utilisée pour les montres sur lunette.
Lorsque j'ai fait des recherches à ce sujet, j'ai senti qu'il y avait un problème. Mon $scope sera-t-il effacé ? Alors continuez à parcourir le code source, j'ai trouvé le code suivant dans la méthode $destroy :
// Disable listeners, watchers and apply/digest methods this.$destroy = this.$digest = this.$apply = this.$evalAsync = this.$applyAsync = noop; this.$on = this.$watch = this.$watchGroup = function() { return noop; }; this.$$listeners = {};
Le code ci-dessus est la posture correcte pour que les variables globales Angularjs soient surveillées par la portée présentée dans cet article. J'espère qu'il vous sera utile. Si cet article n'est pas bien écrit, donnez-moi quelques conseils.