как показать сообщения проверки при отправке формы в угловых js

0

У меня есть форма, в которой есть несколько текстовых полей и поле электронной почты. Я хочу проверить все поля для обязательной/обязательной проверки. Я хочу проверить поле электронной почты для проверки формата электронной почты. Я хочу выполнить проверку только тогда, когда я нажимаю на две кнопки и показываю сообщения проверки в верхней части страницы. Я знаю, что я могу проверить электронную почту и необходимые проверки в поле и использовать 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;
  });
Теги:
validation
directive

1 ответ

1

Без какого-либо кода или прецедента, который следует использовать, я просто покажу вам общий способ проверки ввода. В качестве примера я собираюсь использовать функцию регистрации.

Создайте сервис/фабрику, которая проведет проверку и вернет обещание, если проверка не удастся, она 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>

Вы можете использовать этот пример и изменить его для своего варианта использования.

  • 0
    @Chrillwoodz спасибо. Через пару часов доберусь до дома, обязательно попробую и напишу немного кода, чтобы вы получили ясную картину. Спасибо за то, что постарались объяснить без какой-либо конкретной информации с моей стороны
  • 0
    @ShaileshVaishampayan Проголосуйте и примите его в качестве ответа, если вы нашли его в качестве принятого ответа на ваш вопрос.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню