Angular为我们提供了一些接口绑定JavaScript代码和数据,而绑定数据改变和更新angular则是使用$apply方法实现的。
$apply
进行数据变化检查的实际上是$digest
函数,但是我们往往不是直接使用$digest
,而是使用$apply
,$apply
接收表达式或者函数作为参数后调用$digest来更新绑定部门以及监控器。实际上,Angular几乎在所有提供的代码中添加了$apply
,如ng-click
,初始controller,$http
的回调操作,在这,你并不需要亲自调用 $apply
,而且重复的调用会引起错误。
因此,当你运行了一个新阶段,并且这部分并不属于Angular库的情况下才需要使用$apply
。这有一段关于setTimeout
的代码,在经过了2000毫秒的延迟之后,代码进入执行了一个新的阶段,但是Angular并不知道数据有更新,因此更新并不会被显示。
function Ctrl($scope) { $scope.message = "Waiting 2000ms for update"; setTimeout(function () { $scope.message = "Timeout called!"; // AngularJS unaware of update to $scope }, 2000); }
在上面的代码中就需要调用$apply方法,手动调用,另外Angular提供了$timeout
来代替setTimeout
,相当于在其中默认调用$apply。一般直接使用Angular里面的方法则不用调用$apply方法。
另外,除$http
之外的Ajax调用,除了ng-*
之外的监听器,或者除了$timeout
之外的计时器,都应该使用$scope.$apply
来同步显示绑定。如下例子,则是Ajax的例子。
$.ajax({ type: 'GET', url: '/rest/caseinfo/getcaseinfobybh/' + bh, contentType: "application/json", success: function (data, textStatus) { $scope.caseinfo = data; $scope.$apply(); }, error: function (xmlHttpRequest, textStatus, errorThrown) { alert("获取异常 " + errorThrown); } });
这里使用JQuery里面的方法,调用$scope域内的参数,则需要手动调用$apply方法。