4

如何让自定义验证适用于Kendo Angular指令DatePicker?我想实现以下示例,但使用Angular指令版本DatePicker

页面上有多个日期字段时的 KendoUI DatePicker 验证

任何帮助,将不胜感激。

4

1 回答 1

1

这就是我使用自己的模板和验证实现基于 KEndo 的 Datepicker 的自定义 Datepicker 的方式:

appModule.directive('nemoDatePicker', function () {
    return {
        restrict: 'E',
        require: '?ngModel',
        scope: {
            'name': '@',
            'text': '@',
            'ngModel': '=',
        },
        templateUrl: '/App/nemo/nemoDatePicker.html',
        link: function (scope, element, attrs, ngModel) {
        },
        controller: function ($scope) {
            $scope.error = function (name) {
                var s = $scope.editor[name];
                return $scope.editor.$invalid && $scope.editor.$dirty ? "has-error" : "";
            };
        }
    };
});


appModule.directive('kendoDateValidator', ['$sce', function ($sce) {
    return {
        restrict: 'A', // only activate on element attribute
        require: '?ngModel', // get a hold of NgModelController
        link: function (scope, element, attrs, ngModel) {
            if (!ngModel) return; // do nothing if no ng-model
            
            // Specify how UI should be updated
            ngModel.$render = function () {
                //element.html($sce.getTrustedHtml(ngModel.$viewValue || ''));
            };

            // Listen for change events to enable binding
            element.on('blur keyup change', function () {
                scope.$evalAsync(read);
            });

            read(); // initialize

            function read() {
                
                if (!element.val()) return;
                const startTime = performance.now();
                if (!isDate(element.val()))
                {
                    //console.log(element.val() + " bad");
                    ngModel.$setValidity('date', false);
                }
                else
                {
                    //console.log(element.val() + " good");
                    ngModel.$setValidity('date', true);
                }
                const duration = performance.now() - startTime;
                //console.log("read took " + duration + " ms");
            }

            function isDate(x) {
                var d = kendo.parseDate(x, "dd/MM/yyyy");
                return d instanceof Date;
            };

        }
    };
}]);
<div ng-form="editor">
    <div class="Box" ng-class="error(name)">
        <div class="SubTitle">
            <div class="DirectiveIcon1">
                <span class="glyphicon glyphicon-calendar"></span>
            </div>
            {{text}}
        </div>
        <input kendo-date-picker
               culture="he-IL"
               k-format="'dd/MM/yyyy'"
               id="{{name}}"
               name="{{name}}"
               ng-model="ngModel"
               required 
               kendo-Date-Validator
               class="form-control"/>
        <div>
            <div>
                <span class="help-block" ng-show="editor.$error.required && editor.$dirty">שדה חובה</span>
                <span class="help-block" ng-show="editor.$error.date">יש להזין תאריך</span>
            </div>
        </div>
    </div>
</div>

于 2017-11-28T07:24:14.453 回答