尽管没有数据被更改,为什么绑定会触发$ watch?

时间:2016-06-06 13:41:38

标签: angularjs

我在范围内有一个实体正由用户编辑。每次修改时,我都想触发一些自定义验证。所以我有:

// validate the position if anything has changed
$scope.$watch("entity", function() {
    if ($scope.entity.Id) {
        $scope.validate();
    }
}, true /* watch "by value" (see: https://docs.angularjs.org/guide/scope#scope-life-cycle) */);

到目前为止一切顺利。现在,由于这是一个具有相当多字段的大型实体,因此并非所有字段最初都参与数据绑定。通过使用选项卡控件,用户只能看到部分字段。当用户切换标签时,会显示该实体的另一部分。

但是,当其他控件绑定到实体的相应字段时,即使绑定不会更改实体上的任何值,也会触发$watch

为什么会这样,我怎么能阻止它?

注意: 我认为数据绑定可能会向$...添加一些内部entity字段,但这些字段有望被忽略(至少在angular.equals就是这种情况,因此它们可能会被忽略。我也认为$watch

1 个答案:

答案 0 :(得分:1)

带有对象相等标志$watch

true将旧对象副本的属性与当前对象进行比较。因此,在更改,添加或删除属性名称时将触发侦听器。您可以尝试以下内容:

$scope.$watch("entity", function(newVal, oldVal) {
    if(Object.keys(newVal).length !== Object.keys(oldVal).length)
        return; //Detect added properties

    if ($scope.entity.Id) {
            $scope.validate();
    }
}, true