如何检查变量是否已在angularjs中观察过?

时间:2018-04-13 12:45:07

标签: javascript angularjs

此代码对范围内变量my_var的变化作出反应:

    $scope.$watch('my_var', function () {
        //do somethins
    });

有没有办法检查是否正在观看my_var?例如。有人已在$scope.$watch上调用my_var函数吗?

3 个答案:

答案 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');