Angular 1.3 $parser 验证方法未通过测试

Angular 1.3 $parser validation method not passing test

最近,我们从 Angular 1.2 升级到 1.3。我们仍然需要支持 IE8,所以除了一些调整,一切都基本正常。然而,我有一个奇怪的问题,验证器单元测试失败,但仍在现实生活中工作。另外,我把它移到 $validators 也没关系,它仍然没有通过。并将 1.2 返回到 Karma 通过测试。

这不是什么大问题,但谁能告诉我为什么下面的方法在 1.3 中会失败,而在 1.2 中却不会(而且实际上可以正常工作)?具体问题是正确设置了有效性,但未提交 $viewValue,因此 $modelValue 仍未定义(在我的测试中调用 $commitViewValue() 和 $digest() 什么都不做,同样, $el.val (...); $el.trigger(...)).

测试:

describe('Future date validation directive', function() {
    var $scope, $form;

    beforeEach(module('myapp'));
    beforeEach(inject(function($rootScope, $compile) {
        var $el = angular.element('<form name="form"><input type="date" name="future" ng-model="model.dt" future-date ng-model-options="{ updateOn: \'default\' }" /></form>');

        $scope = $rootScope.$new();
        $scope.model = {
            dt: null
        };

        $compile($el)($scope);
        $form = $scope.form;
    }));

    // This passes
    it('should fail if date is in the past', function() {
        var now = new Date().getTime();
        var day = 1000 * 60 * 60 * 24;
        var yesterday = new Date(now - day);

        $form.future.$setViewValue(yesterday, 'default');
        $scope.$digest();

        expect($scope.model.dt).toBeUndefined();
        expect($form.future.$valid).toBe(false);
    });

    // This fails
    it('should pass if date is in the future', function () {
        var now = new Date().getTime();
        var day = 1000 * 60 * 60 * 24;
        var tomorrow = new Date(now + day);

        $form.future.$setViewValue(tomorrow, 'default');
        $scope.$digest();

        expect($scope.model.dt).toEqual(tomorrow);
        expect($form.future.$valid).toBe(true);
    });
});

指令:

angular.module('myapp')
    .directive('futureDate', [function() {
        return {
            require: 'ngModel',
            link: function(scope, $elem, attrs, ctrl) {
                ctrl.$parsers.unshift(function (viewValue) {
                    var viewTicks = new Date(viewValue).getTime();
                    var currentTicks = new Date().getTime();

                    if (viewTicks > currentTicks) {
                        ctrl.$setValidity('futureDate', true);
                        return viewValue;
                    }

                    ctrl.$setValidity('futureDate', false);
                    return;
                });
            }
        };
    }]);

有什么想法吗?

我想我已经解决了。在 Angular 1.3 中,有一个内置的日期 $parser 可以根据 'YYYY-MM-DD' 的字符串验证日期,因为我的规范正在传递一个实际的日期对象,这是失败的。验证指令在视图中仍然有效,因为我的日期选择器显然传递了一个字符串。所以改变我的规范解决了这个问题。