如何在AngularJS中观看Scope上的所有更改?

Luk*_*nis 14 javascript angularjs

Angular的$ watch函数允许在指定的属性更改时触发事件,如下所示.当范围发生任何变化时,是否有类似的方式来监听事件?

// works
$scope.$watch("someval", function() { }, true);
$scope.$watch(function(scope){ return scope.someval; }, function() { }, true);

// doesn't work
$scope.$watch("this", function() { }, true);
$scope.$watch(function(scope){ return scope; }, function() { }, true);
Run Code Online (Sandbox Code Playgroud)

bml*_*ite 24

我相信你不能$scope注意到的变化(除了使用@ ValentynShybanov的消化).你最接近的事情是观察摘要电话:

$scope.$watch(function() { 
    console.log("digest called"); 
});
Run Code Online (Sandbox Code Playgroud)

每次$digest在作用域上调用a时,都会调用上述函数,即使作用域的属性没有变化也是如此.

  • 每个`$ digest()`也可以多次调用它,做好准备. (2认同)

Yar*_*lav 9

这不是直截了当的,因为范围是一个普通的对象.这是Backbone,您可以订阅所有事件,但为此您的模型应扩展专有接口 - Backbone.Model.Angular将观察者模式放在它的经典外观中.这是一个不寻常的设计决定.基本上有一个循环,其中Angular评估被监视的表达式,当它检测到与前一次迭代的差异时,它会通知观察者.一种非常有趣的方法,可能是观察者模式的唯一替代方法(可能是反应性编程,但这种方法并不常见).

我建议使用一个函数作为监视表达式,它返回范围的哈希值.不幸的是,范围包含某处的循环引用,所以快速解决方案就像JSON.stringify($scope)不起作用.我写了快速而肮脏的概念证明.http://jsfiddle.net/ADukg/2544.无论您输入什么文本字段,它都会打印到控制台.String hash函数取自Javascript/jQuery中的字符串生成Hash.

function MyCtrl($scope) {
    $scope.$watch(
        function($scope) {return hash($scope);},
        function() {console.log("changed");}
    );
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用`angular.toJson`而不是`JSON.stringify`来做到这一点. (3认同)