angular 绑定是如何发生的?

How does angular binding happen?

以下是我对 angularJS 中绑定如何发生的理解。如果高手能提供一下就好了feedback/comment..

<div ng-controller="ctrlA">
  {{myvar}}
  {{anothervar}}
</div>

$scope.watch( function (scope) {
    return scope.anothervar;
  } ,  function (oldValue, newValue) {
    // code to manupilate HTML with new value!!
  });

$scope.watch( function (scope) {
    return scope.myVar;
  } ,  function (oldValue, newValue) {
    // code to manipulate HTML with new value!!
  });

一旦 angularJS 遇到 {{myVar}}(和 {{anothervar}}),就会在内部创建一个观察者(针对每个变量)。这个观察者是为 $scope of controller 'ctrlA'.

创建的

只要在 $timeout、ng-click 等时间内调用函数,它们就会嵌入到 $scope.apply() 中。在你的函数执行后(这可能会改变一些作用域变量),$apply 将在 rootScope 上调用 digest。这将在整个应用程序中使用 UI!

同步变量

当调用 $scope.digest 时,它会遍历该作用域的所有观察者。然后它获取变量的当前值并检查它是否发生了变化。如果它发生变化,它会调用观察者处理程序(它会更改 html 以反映新值!)。

我这里有一个问题。 angularJS store 是否为每个范围都有某种键映射(或某种数据结构),其中包含对观察者的引用和该观察者的当前值?类似于:

watch ref (for myvar) -> current value (of myvar)
watch ref (for anothervar) -> current value (of anothervar)

您对 Angular 如何为每个绑定设置观察者的理解 相当 是对的。我将继续并直接跳到 问题 ,而不是 debunking/discussing 你对 Angular 绑定的内部工作原理的看法。

I have a question here. Does angularJS store have some kind of key-map (or some data structure) for every scope, which contains the reference to watcher and the current value for that watcher??

$scope 有一个当前活跃观察者的内部数组 (.$$watchers) 附加到所述范围,其中条目如下所示:

下面的解释错误。请参阅我的更正编辑

  • eq 是一个布尔值,指示 fn 中的表达式是否成立 true/false.
  • exp 是您在 'squiggles' {{raw_expr_value}} 之间的视图中公开的原始字符串值。
  • 相信 fn 是对内部 $interpolate.$$watchDelegate 的引用(或者如您所说,"a reference to the watcher")。如果这是一本手册 $scope.$watch('val', _func_)fn 将是对 _func_.
  • 的引用
  • get我不太确定。如果有人能补充一下这是什么,那就太棒了。
  • last 是表达式求得的最新值。

综上所述,通常您不应该接触内部 $$ 变量,但如果您必须接触,请继续。 轻装上阵:)


编辑

我错了。查看$watchsource,属性如下:

  • fn - 监听器的回调函数。
  • last - src$watch 设置的最开始应用的 唯一 值。可能是为了触发表达式进行初始评估。
  • get - 用 $parse() 包裹的表达式。
  • exp - prettyPrintExpression 这是我以前从未 听说过的。回退到您视图中的监视表达式 / $watch 处理程序。
  • eq - 这就是我所在的位置 哦,大错特错。布尔值指示我们是在进行深度监视(对象相等)还是常规的浅层监视。