首页 文章

$ digest已经在进行中错误 - 使用自定义指令 - 不是由$ timeout修复的

提问于
浏览
0

我有一个使用 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

    删除 $scope.$apply 并改为使用 $timeout .

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

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

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

相关问题