How do I use $scope.$watch and $scope.$apply in AngularJS?
我不知道如何使用
我不明白的是:
- 它们是否连接到DOM?
- 如何更新模型的DOM更改?
- 他们之间的联系点是什么?
我试过这个教程,但对
您需要了解AngularJS如何工作才能理解它。
摘要循环和$scope首先,AngularJS定义了所谓的消化循环的概念。这个循环可以看作是一个循环,在这个循环中,AngularJS检查所有
一个自然的后续问题是:所有与
有两种方法可以声明一个
广告1)这是最常见的场景,我确信您以前见过,但您不知道这在后台创建了一个手表。是的,它有!使用AngularJS指令(如
广告2)这就是你自己制作手表的方法。当附加到
1 2 3 4 5 6 7 8 9 10 11 12 | function MyController($scope) { $scope.myVar = 1; $scope.$watch('myVar', function() { alert('hey, myVar has changed!'); }); $scope.buttonClicked = function() { $scope.myVar = 2; // This will trigger $watch expression to kick in }; } |
$apply允许将更改与摘要循环集成
您可以将
但是,有时您希望在AngularJS世界之外更改一些值,并看到这些更改正常传播。考虑这个问题-您有一个
为了解决这个问题,引入了
好吧,既然你已经知道了这一切,你真的应该再次学习这个教程。摘要循环将通过评估连接到所有
可以在控制器中显式地将对象附加到
我希望这有助于澄清关于这一切的一些基本知识。
进一步阅读:
- 做你自己的角度,第1部分:范围和摘要
在AngularJS中,我们更新模型,视图/模板"自动"更新DOM(通过内置或自定义指令)。
$apply和$watch都是作用域方法,与DOM无关。
概念页面(部分"运行时")对$digest循环、$apply、$evalasync队列和$watch列表有很好的解释。以下是正文附带的图片:
任何代码都可以访问作用域–通常,控制器和指令(它们的链接函数和/或控制器)可以设置一个"watchExpression",AngularJS将根据该作用域进行评估。每当AngularJS进入它的$Digest循环(特别是"$Watch List"循环)时,就会发生这种评估。可以观察单个范围属性,可以定义一个函数来同时观察两个属性,可以观察数组的长度等。
当发生"inside angularjs"的情况时,例如,您输入一个启用了angularjs双向数据绑定(即使用ng模型)的文本框,$http回调激发等。–$apply已经被调用,因此我们位于上图中的"angularjs"矩形内。将计算所有观察表达式(可能不止一次–,直到检测不到进一步的更改为止)。
当发生"outside angularJS"–的情况时,例如,在指令中使用bind(),然后该事件激发,导致调用回调,或者某些jquery注册的回调激发–我们仍然处于"本机"矩形中。如果回调代码修改了任何$watch正在监视的内容,则调用$apply进入AngularJS矩形,使$digest循环运行,因此AngularJS将注意到更改并发挥其魔力。
这个博客已经涵盖了所有创造例子和可以理解的解释。好的。
AngularJS
当您从视图中的某个地方创建到$scope对象上变量的数据绑定时,AngularJS会在内部创建一个"监视"。手表意味着AngularJS会观察
在应用程序的关键点,AngularJS调用
大多数时候,AngularJS会为您调用$scope.$watch()和
我将在本文的其余部分中详细介绍
- 一个值函数
- 侦听器函数
下面是一个例子:好的。
1 2 3 | $scope.$watch(function() {}, function() {} ); |
第一个函数是值函数,第二个函数是侦听函数。好的。
value函数应返回正在监视的值。然后,AngularJS可以根据Watch函数上次返回的值检查返回的值。这样,AngularJS可以确定值是否已更改。下面是一个例子:好的。
1 2 3 | $scope.$watch(function(scope) { return scope.data.myVar }, function() {} ); |
此示例valule函数返回
请注意,value函数如何将作用域作为参数(名称中没有$)。通过这个参数,value函数可以访问
如果值发生变化,listener函数应该做它需要做的任何事情。也许您需要更改另一个变量的内容,或者设置HTML元素或其他内容。下面是一个例子:好的。
1 2 3 4 5 6 | $scope.$watch(function(scope) { return scope.data.myVar }, function(newValue, oldValue) { document.getElementById("").innerHTML = "" + newValue +""; } ); |
此示例将HTML元素的内部HTML设置为变量的新值,嵌入到B元素中,使值变为粗体。当然,您可以使用代码
只要AngularJS认为有必要,就调用
您可能会遇到一些角情况,其中AngularJS不为您调用
1 2 3 | $scope.$apply(function() { $scope.data.myVar ="Another value"; }); |
作为参数传递给
为了说明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | {{data.time}} <br/> <button ng-click="updateTime()">update time - ng-click</button> <button id="updateTimeButton" >update time</button> var module = angular.module("myapp", []); var myController1 = module.controller("myController", function($scope) { $scope.data = { time : new Date() }; $scope.updateTime = function() { $scope.data.time = new Date(); } document.getElementById("updateTimeButton") .addEventListener('click', function() { console.log("update time clicked"); $scope.data.time = new Date(); }); }); |
他的示例将
该示例还包含两个按钮。第一个按钮有一个
第二个按钮从控制器函数内部获取附加到它的标准JavaScript事件侦听器。单击第二个按钮时,将执行侦听器函数。如您所见,两个按钮的侦听器函数的作用几乎相同,但当调用第二个按钮的侦听器函数时,数据绑定不会更新。这是因为执行第二个按钮的事件侦听器后,不会调用
要解决这个问题,我们可以向按钮事件侦听器的最后一行添加一个
1 2 3 4 5 6 | document.getElementById("updateTimeButton") .addEventListener('click', function() { console.log("update time clicked"); $scope.data.time = new Date(); $scope.$digest(); }); |
除了在button listener函数中调用
1 2 3 4 5 6 7 | document.getElementById("updateTimeButton") .addEventListener('click', function() { $scope.$apply(function() { console.log("update time clicked"); $scope.data.time = new Date(); }); }); |
注意如何从按钮事件侦听器内部调用
AngularJS扩展了这个事件循环,创建了一个名为
$监视()
每次在UI中绑定某些内容时,都会在
1 2 | User: <input type="text" ng-model="user" /> Password: <input type="password" ng-model="pass" /> |
这里我们有绑定到第一个输入的
当加载模板时,也就是在链接阶段,编译器将查找每个指令并创建所需的所有
AngularJS提供
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | angular.module('my_app',[]).controller('myctrl',myctrl)函数myctrl($scope,$timeout){$scope.users=["name":"vinoth<hr><P>我发现了非常深入的视频,包括<wyn>$watch</wyn>、<wyn>$apply</wyn>、<wyn>$digest</wyn>和消化周期:</P><ul><li><P>AngularJS-了解观察者,$watch,$watchgroup,$watchcollection,ng change</P></li><li><P>AngularJS-理解摘要循环(摘要阶段或摘要过程或摘要循环)</P></li><li><P>AngularJS教程-了解$apply和$digest(深入)</P></li></ul><P>以下是这些视频中用来解释概念的几张幻灯片(以防万一,如果上面的链接被删除/不起作用)。</P><P><img src="//i1.wp.com/i.stack.imgur.com/XAR8i.png" alt="Enter image description here"></P><P>在上面的图像中,"$scope.c"不会被监视,因为它不会用于任何数据绑定(在标记中)。另外两个(<wyn>$scope.a</wyn>和<wyn>$scope.b</wyn>将被监视。</P><P><img src="//i1.wp.com/i.stack.imgur.com/ioG04.png" alt="Enter image description here"></P><P>从上图中:基于各自的浏览器事件,AngularJS捕获该事件,执行摘要循环(通过所有观察进行更改),执行观察函数并更新DOM。如果不是浏览器事件,可以使用<wyn>$apply</wyn>或<wyn>$digest</wyn>手动触发摘要循环。</P><P>关于<wyn>$apply</wyn>和<wyn>$digest</wyn>的更多信息:</P><P><img src="//i1.wp.com/i.stack.imgur.com/LuBhi.png" alt="Enter image description here"></P><hr><P>还有<wyn>$watchGroup</wyn>和<wyn>$watchCollection</wyn>。具体来说,如果您想调用函数来更新一个视图中有多个属性而不是DOM对象的对象(例如画布中的其他视图、WebGL或服务器请求),则<wyn>$watchGroup</wyn>非常有用。这里是文档链接。</P><div class="suo-content">[collapse title=""]<ul><li>我本可以评论一下江户一号〔4〕,但我看你已经评论过了。这里是关于安古拉吉斯网站的文档。他们提供了一个非常好的视觉效果的<wyn>$watch</wyn>深度。注意,信息靠近页面底部。</li></ul>[/collapse]</div><p><center>[wp_ad_camp_2]</center></p><hr><P>读完以上所有的,无聊和困倦(对不起,但是真的)。技术性强,深入细致,干燥。我为什么要写作?因为AngularJS是巨大的,许多相互关联的概念可以让任何人发疯。我经常问自己,我是否不够聪明,不能理解他们?不!这是因为很少有人能用一种虚拟语言来解释这项技术,而不需要所有的术语!好吧,让我试试:</P><P>1)它们都是事件驱动的。(我听到笑声,但继续读下去)</P><blockquote> <p> If you don't know what event-driven is Then think you place a button on the page, hook it up w/ a function using"on-click", waiting for users to click on it to trigger the actions you plant inside the function. Or think of"trigger" of SQL Server / Oracle. </p> </blockquote><P>2)$watch是"点击"。</P><blockquote> <p> What's special about is it takes 2 functions as parameters, first one gives the value from the event, second one takes the value into consideration... </p> </blockquote><P>3)$Digest是一个不知疲倦地四处检查的老板,布拉布拉布拉,但是一个好老板。</P><P>4)$apply为您提供了手动操作的方式,例如防故障(如果单击不起作用,则强制它运行)。</P><P>现在,让我们让它可视化。想象一下,这样更容易抓住想法:</P><P>在餐馆里,</P><P>-服务员应该接受顾客的订单,这是</P>[cc]$watch( function(){return orders;}, function(){Kitchen make it;} ); |
-经理跑来跑去确保所有服务员都醒着,对顾客的任何变化做出反应。我是
-业主有权按要求驾驶所有人,这是