user2990
user2990

Reputation: 15

Angular validation on submit

I am trying to create a form that, if you do not fill out any of the fields, will show an alert message if you hit submit. I am trying to work with angular validation to make this happen; however, it is not working at all. Here is the code I currently have:

(1) HTML Event Form file

  function mainController($scope, $http) {
      $scope.formData = {};

      $http.get('/api/events')
        .success(function(data) {
          $scope.events = data;
          initMap(data);
          for(i = 0; i < data.length; i++){
            console.log(data[i].eventLocation);
            //placeMarker(data[i]);
            //test(data);
          }
          //placeMarker(data);
        })
        .error(function(data) {
          console.log('Error: ' + data);
        });

      // when submitting the add form, send the text to the node API
      $scope.createEvent = function() {
        $http.post('/api/events', $scope.formData)
          .success(function(data) {
            $scope.formData = {}; // clear the form so our user is ready to enter another
            $scope.events = data;
            console.log(data);
          })
          .error(function(data) {
            console.log('Error: ' + data);
          });
        }

      // ATTEMPT AT FORM VALIDATION
      $scope.validateForm = function() {
        if (document.getElementById("inputName").value == "" || document.getElementById("inputType").value == "" || document.getElementById("inputLocation").value == "" || document.getElementById("inputDetails").value == "") {
          alert("Please fill in all required fields!");
          return false;
        }
      }
    };
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div class="col-lg-6">
                  <!-- Validate form -->
                  <form name="myForm" onsubmit="return validateForm()">
                   <div class="form-group">
                      
                      <label>Event Name</label>
                      <input type="text" name="inputName" class="form-control" ng-model="formData.eventName" placeholder="Event name">
                    </div>

                     <div class="form-group">
                       <label>Type</label>
                       <select class="form-control" id="inputType" ng-model="formData.eventType">
                         <option>Option 1</option>
                         <option>Option 2</option>
                         <option>Option 3</option>
                         <option>Option 4</option>
                       </select>
                     </div>

                     <div class="form-group">
                       <label>Location</label>
                       <select class="form-control" id="inputLocation" ng-model="formData.eventLocation">
                         <option>Location 1</option>
                         <option>Location 2</option>
                         <option>Location 3</option>
                       </select>
                     </div>

                     <div class="form-group">
                       <label>Event Details</label>
                       <textarea class="form-control" name="inputDetails" ng-model="formData.eventDetails" rows="2" placeholder="Add details about your event"></textarea>
                     </div>
                    <div class="text-center">
                      <button id="add-event"type="submit" class="btn btn-primary"  ng-click="createEvent()">Submit</button>
                    </div>
                  </form>

Upvotes: 0

Views: 4127

Answers (4)

Roh&#236;t J&#237;ndal
Roh&#236;t J&#237;ndal

Reputation: 27232

Try this :

  • Add ng-submit into your element with myForm.$valid condition.
  • Add one ng-click="submitted=true" event on submit button that will trigger when click on the submit button.
  • Add required attribute in all the input fields or mandatory fields.

DEMO

var myApp = angular.module('myApp',[]);

myApp.controller('MyCtrl', function($scope) {
    $scope.validateForm = function() {
      alert("submitting");
    };
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="myApp" ng-controller="MyCtrl">
  <form name="myForm" ng-submit="myForm.$valid && validateForm()" novalidate>
  <p ng-show="submitted==true && myForm.inputName.$invalid">Event name is missing.</p>
  <p ng-show="submitted==true && myForm.inputType.$invalid">Event type is missing.</p>
  <p ng-show="submitted==true && myForm.inputLocation.$invalid">Event Location is missing.</p>
  <p ng-show="submitted==true && myForm.inputDetails.$invalid">Event details is missing.</p>
               <div class="form-group">
                  <label>Event Name</label>
                  <input type="text" name="inputName" class="form-control" ng-model="formData.eventName" required placeholder="Event name">
                </div>

                 <div class="form-group">
                   <label>Type</label>
                   <select class="form-control" name="inputType" id="inputType" ng-model="formData.eventType" required>
                     <option>Option 1</option>
                     <option>Option 2</option>
                     <option>Option 3</option>
                     <option>Option 4</option>
                   </select>
                 </div>

                 <div class="form-group">
                   <label>Location</label>
                   <select class="form-control" name="inputLocation" id="inputLocation" ng-model="formData.eventLocation" required>
                     <option>Location 1</option>
                     <option>Location 2</option>
                     <option>Location 3</option>
                   </select>
                 </div>

                 <div class="form-group">
                   <label>Event Details</label>
                   <textarea class="form-control" name="inputDetails" ng-model="formData.eventDetails" rows="2" placeholder="Add details about your event" required></textarea>
                 </div>
                <div class="text-center">
                  <button id="add-event"type="submit" class="btn btn-primary" ng-click="submitted=true">Submit</button>
                </div>
              </form>
</div>

Upvotes: 0

Manikandan Velayutham
Manikandan Velayutham

Reputation: 2228

Do angularjs way. https://scotch.io/tutorials/angularjs-form-validation

angular.module('exApp', [])
.controller('ctrl', ['$scope', function($scope) {
  $scope.save = function(invalid){
  if(!invalid){console.log('Form Submitted');}
  }
}]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
<body ng-app="exApp" ng-controller="ctrl">
<div>
  <form name="form" class="css-form" novalidate>
    <label>Name:
      <input type="text" ng-model="name" name="userName" required="" />
    </label>
    <br />
    <div ng-show="form.$submitted || form.userName.$touched">
      <div ng-show="form.userName.$error.required">Tell us your name.</div>
    </div>

    <label>E-mail:
      <input type="email" ng-model="email" name="userEmail" required="" />
    </label>
    <br />
    <div ng-show="form.$submitted || form.userEmail.$touched">
      <span ng-show="form.userEmail.$error.required">Tell us your email.</span>
      <span ng-show="form.userEmail.$error.email">This is not a valid email.</span>
    </div>

    Gender:
    <label><input type="radio" ng-model="gender" value="male" />male</label>
    <label><input type="radio" ng-model="gender" value="female" />female</label>
    <br />
    <label>
    <input type="checkbox" ng-model="agree" name="userAgree" required="" />

    I agree:
    </label>
    <input ng-show="agree" type="text" ng-model="agreeMe" required="" />
    <br />
    <div ng-show="form.$submitted || form.userAgree.$touched">
      <div ng-show="!agree || !agreeMe">Please agree and sign.</div>
    </div>

    <input type="button" value="Reset" />
    <input type="submit" value="Save" ng-disabled="form.$invalid || form.$pristine" ng-click="save(form.$invalid)" />
  </form>
</div>

Upvotes: 1

Manuel
Manuel

Reputation: 454

Angular provides some help when using forms. It provides different objects to the form. They are very helpful while validating forms:

  • $pristine: true, if the user has not interacted with the form yet
  • $dirty: true, if the user has interacted with the form
  • $valid: true, if all controls are valid
  • $invalid: true, if at least one control is invalid
  • $error: it contains references to all invalid controls

You can use this object through the form object, in your case myForm. So you can check if the user fills any field using:

$scope.validateForm = function(myForm) {
  if(myForm.$pristine) {
    alert("Please fill in all required fields!");
  }
}

Upvotes: 0

Sachila Ranawaka
Sachila Ranawaka

Reputation: 41445

you can do this using ng-submit for form validation

<form name="myForm" ng-submit="validateForm()">

and for the validation use ng-model variable to validate the form

$scope.validateForm = function() { 
    if (!$scope.formData.eventName || !$scope.formData.eventType  ) {
      alert("Please fill in all required fields!");
      return false;

  }

Demo

Upvotes: 1

Related Questions