如何检查AngularJS中的变量是否已被$watch监听?
如何检查AngularJS中的变量是否已被监听?
当然有办法检查啦!不过得先提一句,AngularJS本身并没有提供官方的公开API来做这件事,我们得借助作用域上的私有属性来实现——虽然是私有属性,但在调试或者特定场景下完全能用。
每个$scope实例内部都维护着一个$$watchers数组,里面存储了所有注册到这个作用域上的监听器对象。每个监听器里的exp属性,就是你调用$watch时传入的监听表达式(比如你例子里的'my_var')。
实现检查的代码示例
你可以写一个简单的工具函数来完成检测:
function isVariableWatched(scope, variableName) { // 先判断$$watchers是否存在,避免作用域还没初始化导致报错 if (!scope.$$watchers) { return false; } // 遍历所有监听器,匹配目标变量名 return scope.$$watchers.some(function(watcher) { // 这里只处理字符串形式的监听表达式 return typeof watcher.exp === 'string' && watcher.exp === variableName; }); } // 使用方式 if (isVariableWatched($scope, 'my_var')) { console.log('my_var已经被监听了!'); } else { console.log('my_var还没被监听~'); }
注意事项
$$watchers是AngularJS的私有属性(开头的两个$就是标志),官方不保证后续版本会保持这个属性的结构或存在性,所以生产环境使用要谨慎,更推荐只用于调试或者内部工具类场景。- 如果监听器是用函数形式注册的(比如
$scope.$watch(function() { return $scope.my_var; }, ...)),上面的函数就检测不到了——因为此时watcher.exp是个函数而非字符串。这种场景下的检测会复杂很多,通常不建议强行处理,除非你有非常特殊的需求。
内容的提问来源于stack exchange,提问作者Cherry
相关产品推荐
相关产品推荐

