角度绑定是如何发生的?

时间:2015-07-23 07:01:55

标签: angularjs angularjs-watch angularjs-bindings

以下是我对angularJS中绑定如何发生的理解。如果专家可以提供反馈/评论会很棒。

<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}}),就会在内部创建一个观察者(对于每个变量)。这个观察者是为控制器'ctrlA'的范围创建的。

每当在$ timeout,ng-click等中调用函数时,它们都嵌入在$ scope.apply()中。执行函数后(可能会更改某些范围变量),$ apply将在rootScope上调用摘要。这将使整个应用程序中的变量与UI同步!

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

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

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

1 个答案:

答案 0 :(得分:0)

你对Angular如何为每个绑定设置一个观察者的理解是几乎就好了。我将继续直接跳到问题,而不是揭穿/讨论你对Angular绑定的内部工作方式的看法。

  

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

$scope有一个当前活动观察者的内部数组(.$$watchers)附加到所述范围,其中一个条目看起来像这样:

enter image description here

以下说明错误。请参阅我的修改编辑

  • eq是一个布尔值,指示fn中的表达式是否成立 真/假。
  • exp是您在“squiggles”{{raw_expr_value}}之间在视图中公开的原始字符串值。
  • 相信 fn是对内部$interpolate.$$watchDelegate的引用(或者当您放置它时,“对观察者的引用” )。如果这是手册$scope.$watch('val', _func_),则fn会引用_func_
  • get 我不太确定。如果有人能填写这是什么,那就超级了。
  • last是表达式评估的最新值。

所有这些都说,通常你不应该触及内部$$变量,但如果你必须 - 直接前进。 轻轻踩踏:)

修改

我错了。查看$watch的{​​{3}},属性如下:

  • fn - 观察者的回调函数。
  • last - source$watch设置开始时应用的唯一值。可能是为了触发表达式进行初步评估。
  • get - 包含$parse()的表达式。
  • exp - src这是我之前从未听到的内容。在您的视图/ $watch处理程序中回退到已观察的表达式。
  • eq - 这就是我哦非常错误的地方。布尔值决定了我们是在进行深度监视(对象相等)还是常规的浅表。