什么被添加到$ scope.默认情况下,观察者在Angular?什么触发$摘要?

Ada*_*ner 0 data-binding angularjs angularjs-scope

我读自创AngularJS和具有怎样的一个体面的理解$scopes,$watch$digest工作.我了解当你添加自己的$watches并且打电话给自己时它是如何工作的$digests.但是,我对于默认情况下究竟发生什么感到困惑.

  1. $scope.$$watchers默认添加什么?你穿的一切$scope?你指定的所有东西ng-model?都?别的什么?

  2. 什么时候确实$digests被默认触发?输入字段更改?输入字段用ng-models?其他?

tas*_*ATT 9

一些在内部使用$watch/ $watchCollection/ 的通用指令$watchGroup:

  1. NG-模型
  2. ng-bind/{{}}
  3. ng-show&ng-hide
  4. 纳克级
  5. NG-重复
  6. NG-如果
  7. NG-开关
  8. NG-包括

请注意,唯一设置双向绑定的是ng-model(范围 - >视图和视图 - >范围).

其他人设置了单向绑定(范围 - >视图).

简单地暴露一些例如控制器的东西$scope不会添加观察者.

例如,以下内容不会导致添加观察程序:

angular.module('myApp', []).controller('Controller', function MyCtrl($scope) {
  $scope.value = 1;
});
Run Code Online (Sandbox Code Playgroud)

和...一起:

<body ng-app="myApp" ng-controller="Controller">
</body>
Run Code Online (Sandbox Code Playgroud)

但是,如果您使用以下内容替换HTML,则会添加一个观察者:

<body ng-app="myApp" ng-controller="Controller">
  <div>{{value}}</div>
</body>
Run Code Online (Sandbox Code Playgroud)

触发摘要周期时的一些常见情况:

  1. 什么时候ng-click评估
  2. ng-model的变化(例如在输入打字时)
  3. 通过$http服务
  4. $timeout$interval

请注意,$apply和之间有一个很大的区别$digest:

调用scope.$digest()将仅在该范围及其子项上执行观察者.

调用scope.$apply()将触发$digest$rootScope,这意味着所有范围将遍历所有观察家执行.

$apply也接受表达式作为参数.此表达式将在try-catch语句中进行计算,并且任何异常都将传递给$exceptionHandler服务.

$digest 不接受任何论点.

通常你只是打电话$digest而不是$apply当你追逐微优化并真正知道你在做什么.