<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; },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)
解决方法
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具有附加到所述范围的当前活动观察者(.$$观察者)的内部数组,其中条目看起来如下:
> eq是一个布尔值,指示fn中的表达式是否成立
真假.
> exp是您在“squiggles”{{raw_expr_value}}之间在视图中公开的原始字符串值.
>我相信fn是对内部$interpolate.$$watchDelegate的引用(或者正如你所说,“对观察者的引用”).如果这是一个手动$scope.$watch(‘val’,_ func_),fn将是对_func_的引用.
>得到我不太确定.如果有人能填写这是什么,那就是超级.
>最后是表达式评估的最新值.
所有这些都说,通常你不应该触及内部$$变量,但如果你必须 – 直接前进.轻轻踩:)
编辑
> fn – 观察者的回调函数.
> last – src在$watch设置开始时应用的唯一值.可能是为了触发表达式进行初步评估.
> get – 用$parse()包装的表达式.
> exp – prettyPrintExpression这是我以前从未听说过的.回到你的视图/ $watch处理程序中观察到的表达式.> eq – 这就是我非常错的地方.布尔值决定了我们是在做深度观察(对象平等)还是常规的浅表.