如果我不能在$ scope()上使用$ apply()我可以使用什么?

时间:2014-08-22 18:12:20

标签: javascript angularjs

在AngularJS中,我读到的每个地方都说你几乎不会自己调用$ apply(),因为它不知何故(通常不清楚)。

有人可以向我解释一下:

  1. 如何避免使用$ apply()但仍在$ scope
  2. 中更新变量
  3. 为什么叫$ apply()
  4. 这么糟糕
  5. 以及如何确定何时可以使用$ apply()
  6. 示例代码:

    app.controller('ExampleController', function($scope) {
    
        $scope.variableForView = 'Initial value';
    
        // for demonstration purposes
        someEvent.on('eventFire', function(data) {
    
            $scope.variableForView = data;
            $scope.$apply(); // ???
    
        });
    
    });   
    

2 个答案:

答案 0 :(得分:0)

基本上,$apply会运行$digest。如果$digest已在运行,则您无法启动其他$digest

我创建了方法$safeApply(),我在$rootScope内添加了run()的原型:

// $safeApply only calls $apply if $digest is not running
// Otherwise, will only call back fn()
Object.getPrototypeOf($rootScope).$safeApply = function(fn)
{
    var phase = $rootScope.$$phase;

    if (phase == '$apply' || phase == '$digest') {
       if (_.isFunction(fn)) fn();
    } else {
       this.$apply(fn);
     }
};

这基本上可以确保您在调用$digest之前尚未进入$apply周期。如果您(这意味着没有必要致电$apply,我只需运行fn。我从不使用$apply()并始终使用$safeApply()

答案 1 :(得分:0)

使用angular提供的绑定方法。然后它会为你做$apply。他们说手动$apply的原因很糟糕是因为你应该使用angular方法进行绑定,如果你没有使用它们并且必须手动$apply,那么你做错了。

app.controller('ExampleController', function($scope) {

    $scope.variableForView = 'Initial value';

    // for demonstration purposes
    $scope.$on('someEventFire', function(data) {
        $scope.variableForView = data;
    });

});

另见https://github.com/angular/angular.js/wiki/When-to-use-%24scope.%24apply%28%29