由于“$消化已经在进行中”;
Directive is not updated due to "$digest already in progress"
在我的控制器中,我将变量"data"设置为默认值。在我最初的项目中,我使用CouchCorner从CouchDB中获取数据并更新数据。
在Derive中,我观察变量数据并相应地更新元素。然而,我遇到了"$digest ready in progress"的问题,这导致deractive没有正确更新。我已经找到了很多关于$digest问题的信息,但我找不到任何适合我的问题的答案。
我创建了以下jsFiddle,它使用$timeout而不是实际的CouchDB请求:http://jsfiddle.net/cwesM/4/
var App = angular.module('myApp', []);
function Ctrl($scope, $timeout) {
$scope.data="Initial";
$timeout(function(){
$scope.data="Updated"}, 1)
}
App.directive('chart', function(){
return{
restrict: 'E',
link: function(scope, elem, attrs){
scope.$watch(attrs.ngModel, function(v){
alert(v)
elem.html("Data="+v);
});
}
};
});
脚本在1ms后将"data"的初始值更改为"Updated"。但是,尽管执行了$watch函数,但该指令不会更新。有趣的是,如果我删除alert(),一切都会按预期进行。
如何避免$digest的冲突?
您可以使用stackoverflow.com/a/17510699上发布的解决方案(答案由@Dor Cohen回答)。
我帮你把它和你当前的代码放在一起。
var App = angular.module('myApp', []);
function Ctrl($scope, $timeout) {
$scope.data = "Initial";
$timeout(function () {
$scope.data = "Updated"
}, 1);
$scope.alert = function (info) {
alert(info);
}
$scope.safeApply = function (fn) {
var phase = this.$root.$$phase;
if (phase == '$apply' || phase == '$digest') {
if (fn && (typeof (fn) === 'function')) {
fn();
}
} else {
this.$apply(fn);
}
};
}
App.directive('chart', function () {
return {
restrict: 'E',
link: function (scope, elem, attrs) {
scope.$watch(attrs.ngModel, function (v) {
scope.safeApply(function () {
alert(v);
});
elem.html("Data=" + v);
});
}
};
});
相关文章:
- 我可以让我的Ajax调用引起一个“;进行中”;光标
- Angular Apply已经在进行中
- 如何避免$digest正在进行中的错误
- 向按钮发送点击事件时,$apply已在进行中
- $digest已在进行中
- $rootScope:进程操作已在进行中
- 如何调用$scope$apply()仅当它's还没有进行中
- 如何编写 .click 的 JQuery 等效项以进行中键单击
- $digest不久之后$watch定义触发“$apply已经在进行中.“错误
- 如何查找 Angular.js 中已经在进行中的哪一行代码触发器$digest
- $scope.申请?$digest已经在进行中
- $scope.$watch 没有调用,但$digest已经在进行中
- 由于“$消化已经在进行中”;
- 正在进行中的 Ajax 请求突然开始返回状态 = 0
- 角度变量未更新,尝试调用$apply导致“;摘要已经在进行中”;错误
- JavaScript中确定数组元素是否正在进行中的最佳方式
- 在sails.js中与船长一起处理上传(正在进行中)
- 文件传输正在进行中不起作用 - PhoneGap 3.5.0
- 错误:在同一个angular Js函数中使用两个Http请求调用时,$digest已经在进行中
- 我该如何避免“$摘要已经在进行中”;AngularJS测试出错