此代码对范围内变量my_var
的变化作出反应:
$scope.$watch('my_var', function () {
//do somethins
});
有没有办法检查是否正在观看my_var
?例如。有人已在$scope.$watch
上调用my_var
函数吗?
答案 0 :(得分:1)
您只需列出所有观察者,并检查您的变量是否有观察者。我不认为还有其他方法可以检查$scope.$watch
是否已经应用了它。
以下是您甚至可以在控制台中粘贴以检查观察者的代码:
function getWatchers(root) {
root = angular.element(root || document.documentElement);
var watcherCount = 0;
function getElemWatchers(element) {
var isolateWatchers = getWatchersFromScope(element.data().$isolateScope);
var scopeWatchers = getWatchersFromScope(element.data().$scope);
var watchers = scopeWatchers.concat(isolateWatchers);
angular.forEach(element.children(), function(childElement) {
watchers = watchers.concat(getElemWatchers(angular.element(childElement)));
});
return watchers;
}
function getWatchersFromScope(scope) {
if (scope) {
return scope.$$watchers || [];
} else {
return [];
}
}
return getElemWatchers(root);
}
console.log(getWatchers())
// this prints the array of watchers, e.g:
// [ {fn: ƒ, last: "my_var", get: ƒ, exp: ƒ, eq: false} ]

代码来自{em> Kent C. Dodds
"Watching your AngularJS Watchers"(代码被修改为打印观察者,而不是仅仅显示使用了多少(数组长度),所以如果你有1000多名观察者,请做好准备)
答案 1 :(得分:1)
这可能有所帮助。
let myVar = $scope.my_var;
Object.defineProperty($scope, 'my_var', {
get: function() {
console.log('Someone called me');
return myVar;
},
set: function(val) {
myVar = val;
}
});
$scope.$apply();
如果正在观看此变量 - 您将在日志中看到某些内容。 (当然你可以从你的js代码获得一些访问权限,但是你可以调试......这也应该是$ scope,其中变量是实际定义的)
答案 2 :(得分:0)
您可以使用以下内容:
function isWatched($scope, ref) {
for(var i = 0; i < $scope.$$watchers.length; i++) {
const w = $scope.$$watchers[i];
if (w && w.exp === ref)
return true;
}
return false;
}
$scope.$watch('my_var', function () {
//do somethins
});
var result = isWatched($scope, 'my_var');