以下是我对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)
答案 0 :(得分: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
的{{3}},属性如下: