4

以下是我对 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'的$scope创建的。

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

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

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

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

1 回答 1

0

您对 Angular 如何为每个绑定设置观察者的理解非常正确。我将继续直接跳到问题上,而不是揭穿/讨论您对 Angular 绑定的内部工作原理的看法。

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

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

在此处输入图像描述

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

  • eq是一个布尔值,指示表达式是否为fn真/假。
  • exp是您在 'squiggles' 之间的视图中公开的原始字符串值{{raw_expr_value}}
  • 相信fn是对内部$interpolate.$$watchDelegate的引用(或者如您所说,“对观察者的引用”)。如果这是一本手册$scope.$watch('val', _func_),那fn将是对_func_.
  • get 我不太确定。如果有人可以填写这是什么,那就太好了。
  • 并且last是表达式计算的最新值。

说了这么多,通常你不应该接触内部$$变量,但如果你必须 - 继续。轻装上阵:)


编辑

我错了。查看 的来源$watch属性如下:

  • fn- 你的观察者的回调函数。
  • last- src在设置的最开始时应用的唯一$watch。可能是为了触发表达式最初进行评估。
  • get$parse()- 用.包裹的表达式
  • exp- prettyPrintExpression,这是我以前从未听说过的。回退到您的视图/$watch处理程序中的观察表达式。
  • eq- 这就是我大错特错的地方。布尔值决定了我们是在进行深度监视(对象相等)还是常规的浅表监视。
于 2015-07-23T08:11:18.627 回答