我在范围内有一个实体正由用户编辑。每次修改时,我都想触发一些自定义验证。所以我有:
// 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
。
答案 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