$ scope.apply()如何在AngularJS中完全正常工作?

时间:2015-04-09 16:40:55

标签: angularjs

我经常在控制器中更新与DOM表达式({{}})对应的模型变量。例如

$scope.myVar = new_value;

有时相应的DOM表达式 {{myVar}} 会自动更新,有些则不是。

我了解有时我们需要调用 $ scope。$ apply 但是......

  • 我不明白何时我应该称之为

  • 有时我称之为(让我们说,只是为了“确定”)但我得到了这个错误(我猜它已经被执行了):

  

错误:[$ rootScope:inprog]   http://errors.angularjs.org/1.3.6/ $ rootScope / inprog?P0 =%24digest

有任何线索吗?

2 个答案:

答案 0 :(得分:2)

基本上申请"刷新"你的前端有你的范围发生的变化。

大部分时间你都不需要申请,因为它已经为你完成了。

让我们说你做了一个ng-click();申请已经完成。

但是,有些情况下不会触发申请,您必须自己动手。

指令示例:

 .directive('someCheckbox', function(){
   return {
     restrict: 'E',
     link: function($scope, $el, $attrs) {
       $el.on('keypress', function(event){
         event.preventDefault();
         if(event.keyCode === 32 || event.keyCode === 13){
           $scope.toggleCheckbox();
           $scope.$apply();
         }
       });
     }
   }
 })

我已经对我的范围进行了更改,但没有对我做任何申请,因此我需要自己做。

超时的另一个例子:

$scope.getMessage = function() {
  setTimeout(function() {
    $scope.message = 'Fetched after two seconds';
    console.log('message:' + $scope.message);
    $scope.$apply(); //this triggers a $digest
  }, 2000);
};

Understanding apply and digest

答案 1 :(得分:2)

了解$scope.apply()的目的的一个好方法是理解,基本上它在角度内部执行内部.digest()以确保范围同步(仔细检查是否有任何更改等)

大多数当时,你永远不需要它!例如,当您对ng-click进行任何更改时,您将执行的大多数典型角度事件scope将自动为您触发。

但是以jQuery UI dialogBox为例。


我们假设您提示用户输入内容,并且当他们按确定按钮时您需要更新scope

Angular并不知道该按钮,也不知道何时触发任何事件。

因此,这是$scope.apply()

的一个非常常见的用例

确定按钮事件中,您只需执行以下操作:

$scope.apply(function () {

    // Angular is now aware that something might of changed

    $scope.changeThisForMe = true;

});
  

简而言之$scope.$apply告诉Angular和任何观察者已经更改了值并返回并检查是否有任何新值。无论你如何进行更改,这都会使事物保持在Angular上下文中,例如在DOM事件,jQuery方法等中。