#javascript #angularjs #date #using-directives
#javascript #angularjs #Дата #использование-directives
Вопрос:
У меня есть приложение, написанное на Angular 1.5.3.
Вот что я хочу сделать:
У меня есть пользовательская форма с 2 типами ввода даты. Мне нужно добавить некоторые пользовательские проверки в мою форму. Я хочу показать пользователю сообщение об ошибке, когда «дата истечения срока действия» в форме больше, чем «дата вступления в силу» в форме.
Я считаю, что могу сделать это с помощью пользовательской директивы и с помощью ng-сообщений.
Вот мой фрагмент кода:
<form name="form.mainForm">
<div>
<span>Effective Date: </span>
<input required type="date" name="effectiveDate" ng-model="effectiveDate" />
<div>
<span>Expiry Date: </span>
<input
type="date"
name="expiryDate"
ng-model="expiryDate"
date-greater-than="{{ effectiveDate }}" />
</div>
</div>
</form>
app.directive('dateGreaterThan', function () {
return {
restrict: 'A',
require: 'ngModel',
scope: false,
link: function (scope, elm, attrs, ctrl) {
console.log(' here we are ');
function isValidDateRange(expiryDate, effectiveDate) {
console.log(expiryDate, effectiveDate);
if (effectiveDate == null || expiryDate == null ) {
return true;
}
return effectiveDate > expiryDate;
}
function validateDateRange(inputValue) {
var expiryDate = inputValue;
var effectiveDate = scope.effectiveDate;
var isValid = isValidDateRange(expiryDate, effectiveDate);
console.log("isValid: ", isValid);
ctrl.$setValidity('dateGreaterThan', isValid);
return inputValue;
}
ctrl.$parsers.unshift(validateDateRange);
ctrl.$formatters.push(validateDateRange);
attrs.$observe('dateGreaterThan', function () {
validateDateRange(ctrl.$viewValue);
});
}
};
Я попытался решить проблему здесь, но я не могу заставить свою директиву работать должным образом. Похоже, он не вычисляет даты при их изменении и не интегрируется с ng-сообщениями.
Вот моя попытка: http://jsfiddle.net/aubz88/q7n3abre /
Ответ №1:
Модуль ngMessages должен быть загружен из cdn. Или устанавливается с помощью менеджера пакетов. Модуль ngMessages не включен в AngularJS. https://code.angularjs.org/1.4.14/docs/api/ngMessages
var app = angular.module("hello", ['ngMessages']);
Некоторые другие моменты. Используйте $validators из ngModel.
ctrl.$validators.dateGreaterThan = validateDateRange;
Передайте другую дату с помощью свойства scope
scope: {dateGreaterThan: '='},
Я думаю, еще многое нужно улучшить. Я тоже забыл кое-что из AngularJS.
например: вы можете снова запустить проверку при изменении первой даты. Проверьте функцию $validate для https://code.angularjs.org/1.4.14/docs/api/ng/type/ngModel .ngModelController .
Вы можете проверить эту скрипку для базовой настройки: http://jsfiddle.net/hcjLkuzt /