$ digest已在进行中错误 - 使用自定义指令 - 未由$ timeout

时间:2015-08-14 17:11:04

标签: angularjs angularjs-scope

我有一个使用scope.apply的自定义指令datepicker,效果很好。我删除了大部分内容以避免混淆问题,这是一个简单的版本

appAdmin.directive("datepickerPss", ["$compile", "$parse", function ($compile, $parse) {
    return {                   
            $element.datepicker($scope.options).on("changeDate", function (ev) {
                $scope.$apply(function () {
                    ngModel.$setViewValue(ev.date);
                });
            });
}
}]);

我在模态中有自定义日期选择器,我只是想初始化值,所以在我的控制器中我在顶部执行了以下操作并且“$ digest已在进行中”错误

$scope.sDate = Date.now();

因此,阅读此问题并适用范围我在控制器中将其更改为以下内容

$timeout(function() {
        $scope.sDate = Date.now();
    });

但是我仍然得到$ digest in progress错误。我不知道从哪里开始。我读过的所有帖子都使用$ timeout来解决问题。

1 个答案:

答案 0 :(得分:0)

删除$scope.$apply,然后改用$timeout

$element.datepicker($scope.options).on("changeDate", function (ev) {
    $timeout(function () {
        ngModel.$setViewValue(ev.date);
    }, 0);
});

$scope.$apply在$ rootScope上启动一个新的$ digest循环,因此在你的指令中调用它会启动另一个$ digest循环,而其中一个已经发生。通过将您的通话包裹在$ timeout中,它会等到上一个$摘要周期结束后再应用您的更改。

此外,如果您在指令中已经绑定了更改事件后尝试初始化值,则可能会遇到问题,因为指令的摘要周期可能仍在进行中你的控制器正在被解析和执行。