Angular $watch - 只执行一次 watch 块

Angular $watch - execute watch block only once

我在 dropdown 值上有一个简单的 $watch :

$scope.view;
$scope.$watch('view', function(){
  console.log(1);       
  // watch block
}

该值与 ng-model 链接:

<select ng-model="view" ng-options="x for x in name">
</select>

由于 $digest 值 1 被打印了两次,有没有办法告诉 angular 只执行一次 $watch 块?

简单回答:第一次成功后注销手表运行:

var viewWatch = $scope.$watch('view', function () {
  viewWatch(); // Stops the watch
  console.log(1);       
  //watch block
};

然而,这可能会或可能不会产生您想要的结果,因为有时会在初始化时调用 $watch。您可能需要设置一些条件:

var viewWatch = $scope.$watch('view', function (currentValue, oldValue) {
  if (currentValue && !oldValue) {
    viewWatch(); // Stops the watch
    console.log(1);       
    //watch block
  }
};

您可以通过测试参数来简单地测试 view 是否将首次设置(声明)或将要更改(由 select):

$scope.$watch('view'), function(newVal, oldVal) {
  if (oldVal && oldVal != newVal) {
    console.log(1)
  }
}