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方法。