Я делаю дату рождения типа элемента ввода, который не имеет вида календаря. то есть пользователь заполняет дату, набрав.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 кодирования!
Я работаю просто отлично! Я не вижу здесь ни одного вопроса или проблемы ... может быть, я не совсем понял, что вопрос у вас может возникнуть? –
@ Angular_10 Да, функциональность работает отлично. Но есть небольшая проблема, выполните следующие шаги: 1. начните заполнять дату, 2. очистите поле, нажав backspace, 3. Вы должны увидеть сообщение «Дата требуется», но вы не видите его на самом деле, если только вы нажмите кнопку «Отправить». –
Да, я только что заметил это! Ну в этом случае, что вы можете сделать, это ухватить событие backspace с помощью ng-keydown и написать функцию в вашей директиве, которая установит соответствующее сообщение. Это сработало для меня! –