Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从datepicker选择日期时,显示$apply已在进行中_Javascript_Angularjs - Fatal编程技术网

Javascript 从datepicker选择日期时,显示$apply已在进行中

Javascript 从datepicker选择日期时,显示$apply已在进行中,javascript,angularjs,Javascript,Angularjs,当从datepicker中选择date时,显示$apply已在进行中,控制台显示错误,如 错误:[$rootScope:inprog]$apply已在进行中 我使用的指令是: enter code here focus: function (e) { scope.$apply(function () { scope.PresentDateOpened = true; }); }, change: function (e) { scope.$apply(

当从datepicker中选择date时,显示$apply已在进行中,控制台显示错误,如

错误:[$rootScope:inprog]$apply已在进行中

我使用的指令是:

enter code here

focus: function (e) {
    scope.$apply(function () {
        scope.PresentDateOpened = true;
    });
},
change: function (e) {

    scope.$apply(function () {
        if (element.val() == "") {
            ngModel.$setValidity('validDate', true);
        }
    });
},
blur: function (e) {
    if (element.val() != "") {
        scope.$apply(function () {
            var data = element.val().toString().split('-');
            if (data.length == 3) {
                var month = new Date(data[2], data[1], data[0]).getMonth();
                var day = new Date(data[2], data[1], data[0]).getDate();
                var year = new Date(data[2], data[1], data[0]).getFullYear();

                if (!isNaN(month) && !isNaN(day) && !isNaN(year)) {
                    if (angular.isDate(new Date(day, month, year))) {
                        ngModel.$setValidity('validDate', true);
                        ngModel.$setViewValue(new Date(data[2], data[1] - 1, data[0]), 'dd-MMM-yyyy');
                        ngModel.$render();
                    }
                    else {
                        ngModel.$setValidity('validDate', false);
                    }
                }

而不是作用域。$apply使用$timeout。更多信息可在此处找到

使用安全应用

scope.safeApply(function() {
                    var data = element.val().toString().split('-');
                    if (data.length == 3) {
                        var month = new Date(data[2], data[1], data[0]).getMonth();
                        var day = new Date(data[2], data[1], data[0]).getDate();
                        var year = new Date(data[2], data[1], data[0]).getFullYear();

                        if (!isNaN(month) && !isNaN(day) && !isNaN(year)) {
                            if (angular.isDate(new Date(day, month, year))) {
                                ngModel.$setValidity('validDate', true);
                                ngModel.$setViewValue(new Date(data[2], data[1] - 1, data[0]), 'dd-MMM-yyyy');
                                ngModel.$render();
                            } else {
                                ngModel.$setValidity('validDate', false);
                            }
                        }

                    });


scope.safeApply = function(fn) {
  var phase = this.$root.$$phase;
  if(phase == '$apply' || phase == '$digest') {
    if(fn && (typeof(fn) === 'function')) {
      fn();
    }
  } else {
    this.$apply(fn);
  }
};

但当在datepicker中单击时,它显示UncaughtTypeError:$timeout不是一个函数$timeout是一个标准服务。在使用它之前需要先注入它。$timeoutfunction{}等于setTimeoutscope。$applyfunction{}。由于角度摘要循环的内部结构,当摘要循环进行时,不应该调用apply。您需要将其推迟到下一个事件循环周期,这就是setTimeout所做的。如果此答案解决了您的问题,请接受此答案。请参阅第二点。另外,您不应该在应用程序中使用$$phase,因为它是一个私有变量。是的,我们确实不需要在代码中使用它们,但是这些补丁可以帮助我们执行一些任务,比如一些技巧。请看这里