Javascript 在大型angular应用程序中使用$watch而不是绑定到函数以提高性能是否明智?

Javascript 在大型angular应用程序中使用$watch而不是绑定到函数以提高性能是否明智?,javascript,angularjs,Javascript,Angularjs,我试过: <div ng-show="isDirty()" /> $scope.isDirty = function() { console.log('isDirty'); return field.isDirty; } $scope.isDirty=函数(){ console.log('isDirty'); 返回字段.isDirty; } 及 $scope.$watch('field.isDirty',函数(oldValue,newValue){ cons

我试过:

<div ng-show="isDirty()" />

$scope.isDirty = function() {
    console.log('isDirty');
    return field.isDirty;
}

$scope.isDirty=函数(){
console.log('isDirty');
返回字段.isDirty;
}


$scope.$watch('field.isDirty',函数(oldValue,newValue){
console.log('isDirty');
$scope.isDirty=newValue;
});

第一个选项比第二个选项触发的次数多。当我做与field.isDirty无关的事情时,第一个选项也会被触发

第一个选项触发的次数更多,因为您实际上在不同的情况下触发它。在第一种情况下,函数结果有一个观察者。它激发每个摘要循环以获得新值并将其与旧值进行比较。在第二个选项中,非常接近第一个观察者。但你无法看到它会激发每个摘要循环。只有当结果发生实际变化时才能看到

为了使实验诚实,您应该使用不带表达式的watcher():


如果希望在调用$digest时收到通知,可以注册一个不带侦听器的watchExpression函数。(由于当检测到更改时,watchExpression可以在每个$digest循环中执行多次,因此请准备好多次调用您的侦听器。)

完全取决于应用程序设计。如果在经常变化的变量上放置一个
$watch
,并且有100个类似的变量。那么它会影响性能。通常我更喜欢第二种方法。但有时我们需要使用旧值,而那时我们有
newValue
,您需要使用watch&此外,观察者还执行可能导致性能问题的脏检查。请记住,
ng show
添加了一块手表。所以,第1个版本是一个简单函数调用的1个表。好啊第二个版本是2块手表;此外,更改分两个阶段进行:
field.isDirty
被监视,发现已更改,然后设置
$scope.isDirty
。这将触发另一个摘要周期来更新DOM。所以第二个解决方案=>2个手表和2个摘要周期=>不好。我知道这只是一个例子,但为什么不
ng show=“field.isDirty”
?是的,正如@NikosParaskevopoulos提到的,第二个变体为
$scope.isDirty
属性添加了第二个手表。
<div ng-show="isDirty" />

$scope.$watch('field.isDirty', function(oldValue, newValue) {
    console.log('isDirty');
    $scope.isDirty = newValue;
});