У меня есть форма, в которой есть несколько текстовых полей и поле электронной почты. Я хочу проверить все поля для обязательной/обязательной проверки. Я хочу проверить поле электронной почты для проверки формата электронной почты. Я хочу выполнить проверку только тогда, когда я нажимаю на две кнопки и показываю сообщения проверки в верхней части страницы. Я знаю, что я могу проверить электронную почту и необходимые проверки в поле и использовать ng-show и флаг, который я могу показать сообщениям. Однако я хочу проверить каждое значение поля в директиве, а затем установить флаг в значение true, которое сделает сообщение отображаемым.
Вот мой HTML. это загружается, почему государственный поставщик на главной странице, который также определяет следующий шаблон и контроллер для него. поэтому его просто мнение частично:
<form name="myForm">
<div ng-show="validationFailed">
<!-- here i want to display validation messages using cca.validationMsgs object -->
</div>
<input type="text" name="test" ng-model="cca.field1" require />
....
<input type="email" mg-model="cca.field2" />
<input type="button" name="mybutton" />
</form>
Теперь контроллер определен в другом JS файле:
'use strict';
(function(){
angular.module('store', []);
app.controller("StoreController",function(){
var cca = this;
cca.validationMsgs = {};
cca.validationFailed = false; //this flag should decide whether validation messages should be displayed on html page or not.when its true they are shown.
...//other mapped fields
});
И вот незаконченная директива, которую я хочу определить и написать свою логику. Логика будет примерно такой: 1) перебрать все элементы, которые требуют установить на них, и проверить их объект $ validators object/$ error.required object установлен 2) если да, установите флажок validationFailed в true, добавьте сообщение проверки на объект validationMsgs и разбить петлю. 3) проверьте, установлено ли поле типа электронной почты $ error.email, и если да, то аналогично установите флажок validationFailed в true и добавьте соответствующее сообщение этому объекту. Не уверен, действительно ли мне нужна директива для этого. Я хотел бы применить директиву внутри элемента.
app.directive("requireOnSubmit",function(){
var directiveDefinitionObject = {
restrict:'E',
//.... need to fill in
//I can use link funcion but not sure how to map
// validationMsgs and validationFailed objects in here.
};
return directiveDefinitionObject;
});
Без какого-либо кода или прецедента, который следует использовать, я просто покажу вам общий способ проверки ввода. В качестве примера я собираюсь использовать функцию регистрации.
Создайте сервис/фабрику, которая проведет проверку и вернет обещание, если проверка не удастся, она reject
обещание. Если нет, он resolve
это.
Важное примечание: обещание может быть разрешено только однажды (либо выполнено, либо отклонено), что означает, что первое объявление resolve
или reject
всегда будет "побеждать", а это означает, что вы не можете переопределить какое-либо resolve
или reject
. Таким образом, в этом примере, если поле пустое, а электронная почта пользователя не определена, сообщение об ошибке будет All fields must be filled in
а не Invalid email format
.
auth.factory('validation', ['$q', function($q) {
return {
validateSignup: function(newUser) {
var q = $q.defer();
for (var info in newUser) {
if (newUser[info] === '') {
q.reject('All fields must be filled in');
}
}
if (newUser.email === undefined) {
q.reject('Invalid email format');
}
else if (newUser.password.length < 8) {
q.reject('The password is too short');
}
else if (newUser.password != newUser.confirmedPass) {
q.reject('The passwords do not match');
}
q.resolve(true);
return q.promise;
}
}
}]);
И затем вводите это в свой контроллер
auth.controller('AuthCtrl', ['$scope', '$location', 'validation', function($scope, $location, validation) {
$scope.status = {
message: ''
}
// Make sure nothing is undefined or validation will throw error
$scope.newUser = {
email: '',
password: '',
confirmedPass: ''
}
$scope.register = function() {
// Validation message will be set to status.message
// This will also clear the message for each request
$scope.status = {
message: ''
}
validation.validateSignup($scope.newUser)
.catch(function(err) {
// The validation didn't go through,
// display the error to the user
$scope.status.message = err;
})
.then(function(status) {
// If validation goes through
if (status === true) {
// Do something
}
});
}
И в HTML вы можете иметь что-то вроде этого:
<form>
<div>
<label for="email">Email:</label>
<input type="email" id="email" ng-model="newUser.email">
</div>
<div>
<label for="password">Password:</label>
<input type="password" id="confirm-pass" ng-model="newUser.password">
</div>
<div>
<label for="confirm-pass">Confirm password:</label>
<input type="password" id="confirm-pass" ng-model="newUser.confirmedPass">
</div>
<div>
<div>
<span ng-bind="status.message"></span>
</div>
</div>
<div>
<button ng-click="register(newUser)">Register</button>
</div>
</form>
Вы можете использовать этот пример и изменить его для своего варианта использования.