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

时间:2015-07-14 07:21:14

标签: javascript angularjs

当从datepicker中选择日期时,它显示$apply正在进行中,并且控制台显示错误,如

  

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

我使用的指令是:

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);
                    }
                }

2 个答案:

答案 0 :(得分:0)

而不是范围。$ apply使用$ timeout。更多信息可以在https://stackoverflow.com/a/17958847/1324935

找到

答案 1 :(得分:0)

使用安全申请。

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);
  }
};