在AngularJS中,我读到的每个地方都说你几乎不会自己调用$ apply(),因为它不知何故(通常不清楚)。
有人可以向我解释一下:
示例代码:
app.controller('ExampleController', function($scope) {
$scope.variableForView = 'Initial value';
// for demonstration purposes
someEvent.on('eventFire', function(data) {
$scope.variableForView = data;
$scope.$apply(); // ???
});
});
答案 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