我经常在控制器中更新与DOM表达式({{}})对应的模型变量。例如
$scope.myVar = new_value;
有时相应的DOM表达式 {{myVar}} 会自动更新,有些则不是。
我了解有时我们需要调用 $ scope。$ apply 但是......
我不明白何时我应该称之为
有时我称之为(让我们说,只是为了“确定”)但我得到了这个错误(我猜它已经被执行了):
错误:[$ rootScope:inprog] http://errors.angularjs.org/1.3.6/ $ rootScope / inprog?P0 =%24digest
有任何线索吗?
答案 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);
};
答案 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方法等中。