Reputation: 808
I am trying to submit a blank form, which should trigger the some custom error messages on my mandatory fields. All the validation works perfectly. Only issue arises is when the form 1st time loads and the user directly clicks on the submit button without clicking anywhere in the form. Due to this the Checkbox error message gets displayed but the input tag error message is not displayed. The custom directive emailValidate validates the email address on the blur event with a regex.
Is there any way that i can ng-show the Error message for the input tag on the submit button click alone if it is empty.
Please find my code below -
HTML Code -
<div ng-controller="NewsletterController" class="overlayContent" id="newsletterOverlayContent" novalidate>
<p>
<label>Email<span class="mandatory">*</span></label>
<input type="email" ng-model="user.email" email-validate required name="email" />
<span class="ui-state-error h5-message" ng-show="_ServerForm.email.$error.emailValidate && _ServerForm.email.$error.required">
<span class="h5-arrow"></span>
<span class="h5-content">Error</span>
</span>
</p>
<p class="align">
<input type="checkbox" ng-model="user.termsagreement" name="termsagreement" value="true" required id="TermsAndConditions">
<span class="ui-state-error h5-message" ng-show="_ServerForm.termsagreement.$error.required && buttonClicked">
<span class="h5-arrow"></span>
<span class="h5-content">I agree</span>
</span>
<span class="checkBoxText">
<span class="mandatory">*</span>Check the box
</span>
</p>
<div style="float:right" class="buttonSimple">
<a name="Register" id="RegisterUser" href="#" class="" ng-click="submitform($event)"><span>Registrieren</span></a>
</div>
Controller.js
function NewsletterController($scope) {
$scope.submitform = function ($event) {
$event.preventDefault();
$scope.buttonClicked = true;
}
}
NewsletterController.$inject = ['$scope'];
Upvotes: 2
Views: 11789
Reputation: 808
@MWay - I was going through certain best practises and found that using for Loop is Angular JS is not recommended.
So the Solution i got to my problem is -
<span class="ui-state-error h5-message" ng-show="(_ServerForm.email.$dirty && _ServerForm.email.$error.emailValidate) || (buttonClicked && _ServerForm.email.$invalid)">
Upvotes: 2
Reputation: 33171
Use this on submit/click:
var submitValidate = function(_form) {
for (field in _form) {
// look at each form input with a name attribute set
// checking if it is pristine and not a '$' special field
if (field[0] != '$' && _form[field].$pristine) {
// set it to the current model value (ie. leaving as is)
_form[field].$setViewValue(_form[field].$modelValue);
}
}
};
EDIT:
I have now included a working fiddle here that uses the above function to solve your problem. Test it by clicking on the submit button first: http://jsfiddle.net/HB7LU/1804/
Upvotes: -1
Reputation: 108491
A few things about this:
<form>
tag.All of that said, you can accomplish what you're trying with ng-click
and ng-submit
working together:
Your view:
<form name="myForm" ng-submit="submitForm()">
<label>Name <input type="text" name="name" ng-model="name" required/></label>
<span ng-show="myForm.name.$error.required && buttonClicked">required</span>
<button ng-click="buttonClicked = true">Submit</button>
</form>
and your controller:
app.controller('MainCtrl', function($scope, $window) {
$scope.name = 'World';
$scope.submitForm = function (){
$window.alert('form submitted!');
}
});
As well as the gratuitous Plunk
If you're using Angular form validation and ng-submit
you don't have to worry about $event.preventDefault()
. Generally, you're almost never going to need to use $event
, which the exception being nested ng-clicks
, and even then you can use it directly on the view... but that's a different topic all together.
Likewise, generally, you're almost never going to need to reference your ngModels
(stored in your $scope.formNameHere
) from your controller. If you are, you might want to investigate whether or not there's a better, reusable way to do whatever you're doing... like a custom validation directive.
I hope that helps.
Upvotes: 0