2016-09-09 2 views
3

Я делаю дату рождения типа элемента ввода, который не имеет вида календаря. то есть пользователь заполняет дату, набрав.AngularJS Пользовательский ввод даты рождения не показывает требуемую ошибку

Код

angular.module('myApp', []) 
 
.directive('birthDatePicker', [ function() { 
 
     return { 
 
      restrict: 'A', 
 
      require: 'ngModel', 
 
      scope: { 
 
       model: '=ngModel', 
 
      }, 
 
      link: function (scope, element, attrs, ngModel) { 
 

 
       //SET CURSOR POSITION 
 
       var setCursorPosition = function(pos) { 
 
        if (element[0].setSelectionRange) { 
 
         element[0].focus(); 
 
         element[0].setSelectionRange(pos, pos); 
 
        } else if (element[0].createTextRange) { 
 
         var range = element[0].createTextRange(); 
 
         range.collapse(true); 
 
         range.moveEnd('character', pos); 
 
         range.moveStart('character', pos); 
 
         range.select(); 
 
        } 
 
       }; 
 

 
       // RESET VALIDATION ERRORS 
 
       var resetErrors = function() { 
 
        ngModel.$setValidity('pattern',true); 
 
       }; 
 

 
       if (!ngModel) return; 
 
       var d1, d2, m1, m2, y1, y2, y3, y4, cursorPos, dateString, parsedDate; 
 
       ngModel.$parsers.unshift(function (inputValue) { 
 
        var digits = inputValue.split('').filter(function (s) { return (!isNaN(s) && s != ' '); }); 
 
        d1 = digits[0] ? digits[0] : 'd'; 
 
        d2 = digits[1] ? digits[1] : 'd'; 
 
        m1 = digits[2] ? digits[2] : 'm'; 
 
        m2 = digits[3] ? digits[3] : 'm'; 
 
        y1 = digits[4] ? digits[4] : 'y'; 
 
        y2 = digits[5] ? digits[5] : 'y'; 
 
        y3 = digits[6] ? digits[6] : 'y'; 
 
        y4 = digits[7] ? digits[7] : 'y'; 
 
        dateString = d1+d2+'/'+m1+m2+'/'+y1+y2+y3+y4; 
 

 
        resetErrors(); 
 

 
        if(dateString == 'dd/mm/yyyy') { 
 
         ngModel.$viewValue = ''; 
 
         ngModel.$render(); 
 
         return ngModel.$viewValue; 
 
        } 
 

 
        ngModel.$viewValue = dateString; 
 
        ngModel.$render(); 
 
        cursorPos = digits.length + 2; 
 
        if(digits.length < 3) { 
 
         cursorPos = digits.length; 
 
        } else if (digits.length < 5) { 
 
         cursorPos = digits.length + 1; 
 
        } 
 

 
        setCursorPosition(cursorPos); 
 

 
        parsedDate = new Date(ngModel.$viewValue); 
 

 
        // validation for correct date 
 
        if(isNaN(parsedDate.getTime())){ 
 
         ngModel.$setValidity('pattern',false); 
 
         return ngModel.$viewValue; 
 
        } else { 
 
         ngModel.$setValidity('pattern',true); 
 
        } 
 

 
        return ngModel.$viewValue; 
 
       }); 
 
      } 
 
     }; 
 
    }]);
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular.js"></script> 
 
<body ng-app="myApp"> 
 
    <form name="myForm" novalidate> 
 
    <input ng-model="date" name="question" 
 
      placeholder="dd/mm/yyyy" birth-date-picker type="tel" autocomplete="off" required> 
 
    <p ng-show="myForm.question.$error.required">Date is Required</p> 
 
    <p ng-show="myForm.question.$error['pattern']">Date is incorrect</p> 
 
    <input type="submit"> 
 
    </form> 
 
</body>

Проблема с отображением сообщения об ошибке. Сообщение Date is required отображается только в первый раз и при нажатии кнопки отправки. Он не работает, когда пользователь очищает входное значение, нажав клавишу backspace.

Update: На нижней версии AngularJS, она работает просто отлично, как то, что я хотел, но с AngularJS 1.5.8, я имею несчастье. :(

Пожалуйста, помогите мне решить эту проблему.

Happy кодирования!

+0

Я работаю просто отлично! Я не вижу здесь ни одного вопроса или проблемы ... может быть, я не совсем понял, что вопрос у вас может возникнуть? –

+0

@ Angular_10 Да, функциональность работает отлично. Но есть небольшая проблема, выполните следующие шаги: 1. начните заполнять дату, 2. очистите поле, нажав backspace, 3. Вы должны увидеть сообщение «Дата требуется», но вы не видите его на самом деле, если только вы нажмите кнопку «Отправить». –

+0

Да, я только что заметил это! Ну в этом случае, что вы можете сделать, это ухватить событие backspace с помощью ng-keydown и написать функцию в вашей директиве, которая установит соответствующее сообщение. Это сработало для меня! –

ответ

0

Согласно документации на https://docs.angularjs.org/api/ngMessages/directive/ngMessages и, например, на этой странице, это то, как вы должны использовать нг-сообщений ...

angular.module('myApp', []) 
 
.directive('birthDatePicker', [ function() { 
 
     return { 
 
      restrict: 'A', 
 
      require: 'ngModel', 
 
      scope: { 
 
       model: '=ngModel', 
 
      }, 
 
      link: function (scope, element, attrs, ngModel) { 
 

 
       //SET CURSOR POSITION 
 
       var setCursorPosition = function(pos) { 
 
        if (element[0].setSelectionRange) { 
 
         element[0].focus(); 
 
         element[0].setSelectionRange(pos, pos); 
 
        } else if (element[0].createTextRange) { 
 
         var range = element[0].createTextRange(); 
 
         range.collapse(true); 
 
         range.moveEnd('character', pos); 
 
         range.moveStart('character', pos); 
 
         range.select(); 
 
        } 
 
       }; 
 

 
       // RESET VALIDATION ERRORS 
 
       var resetErrors = function() { 
 
        ngModel.$setValidity('pattern',true); 
 
       }; 
 

 
       if (!ngModel) return; 
 
       var d1, d2, m1, m2, y1, y2, y3, y4, cursorPos, dateString, parsedDate; 
 
       ngModel.$parsers.unshift(function (inputValue) { 
 
        var digits = inputValue.split('').filter(function (s) { return (!isNaN(s) && s != ' '); }); 
 
        d1 = digits[0] ? digits[0] : 'd'; 
 
        d2 = digits[1] ? digits[1] : 'd'; 
 
        m1 = digits[2] ? digits[2] : 'm'; 
 
        m2 = digits[3] ? digits[3] : 'm'; 
 
        y1 = digits[4] ? digits[4] : 'y'; 
 
        y2 = digits[5] ? digits[5] : 'y'; 
 
        y3 = digits[6] ? digits[6] : 'y'; 
 
        y4 = digits[7] ? digits[7] : 'y'; 
 
        dateString = d1+d2+'/'+m1+m2+'/'+y1+y2+y3+y4; 
 

 
        resetErrors(); 
 

 
        if(dateString == 'dd/mm/yyyy') { 
 
         ngModel.$viewValue = ''; 
 
         ngModel.$render(); 
 
         return ngModel.$viewValue; 
 
        } 
 

 
        ngModel.$viewValue = dateString; 
 
        ngModel.$render(); 
 
        cursorPos = digits.length + 2; 
 
        if(digits.length < 3) { 
 
         cursorPos = digits.length; 
 
        } else if (digits.length < 5) { 
 
         cursorPos = digits.length + 1; 
 
        } 
 

 
        setCursorPosition(cursorPos); 
 

 
        parsedDate = new Date(ngModel.$viewValue); 
 

 
        // validation for correct date 
 
        if(isNaN(parsedDate.getTime())){ 
 
         ngModel.$setValidity('pattern',false); 
 
         return ngModel.$viewValue; 
 
        } else { 
 
         ngModel.$setValidity('pattern',true); 
 
        } 
 

 
        return ngModel.$viewValue; 
 
       }); 
 
      } 
 
     }; 
 
    }]);
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular.js"></script> 
 
<body ng-app="myApp"> 
 
    <form name="myForm" novalidate> 
 
    <input ng-model="date" name="question" 
 
      placeholder="dd/mm/yyyy" birth-date-picker type="tel" autocomplete="off" required> 
 
<div ng-messages="myForm.question.$error" role="alert"> 
 
     <div ng-message="required">Date is Required</div> 
 
     <div ng-message="pattern">Date is incorrect</div> 
 
</div> 
 
    <input type="submit"> 
 
    </form> 
 
</body>

+0

сообщения об ошибках всегда отображаются при запуске фрагмента кода. –

0

Вы пытаетесь плохой подход оберточной нг-модели. Попробуйте Ben Nadel approach, это должно осветить проблему.