{"flag":true,"single":true,"pageTitle":"Forms and form validation","post":{"id":149,"user_id":"1","slug":"form-validation-angular-using-local-template-reference-variable-tmjk","title":"Forms and form validation","body":"<p>HTML CODE<\/p>\r\n<p>1. &nbsp;using &nbsp;local template reference variable<\/p>\r\n<pre class=\"language-markup\"><code>&lt;form class=\"contact-form needs-validation\"  novalidate #myForm=\"ngForm\" (ngSubmit)=\"handleForm(myForm)\"&gt;\r\n  &lt;input required email minlength=\"4\" type=\"email\" #email='ngModel' name=\"email\" ngModel&gt;\r\n  \r\n  &lt;div *ngIf=\"email.invalid &amp;&amp; (email.dirty || email.touched)\" class=\"alert alert-danger\"&gt;\r\n      &lt;div *ngIf=\"email.errors?.['required']\"&gt;\r\n        Email is required.\r\n      &lt;\/div&gt;\r\n      &lt;div *ngIf=\"email.errors?.['minlength']\"&gt;\r\n        Email must be at least 6 characters long.\r\n      &lt;\/div&gt;\r\n      &lt;div *ngIf=\"email.errors?.['email']\"&gt;\r\n        Its not correct Email\r\n      &lt;\/div&gt;\r\n      \r\n  &lt;\/div&gt;\r\n    &lt;input type=\"submit\" class=\"btn btn-outline-primary rounded-pill btn-send mb-3\" value=\"Subscribe\" (click)=\"myForm.form.markAllAsTouched()\"&gt;\r\n&lt;\/form&gt;<\/code><\/pre>\r\n<p>COMPONENT<\/p>\r\n<pre class=\"language-markup\"><code>export class EmailSubscriptionComponent {\r\n  handleForm(data:any){\r\n    if (data.valid) {\r\n      \/\/ Form is valid, perform submission logic here\r\n    } else {\r\n      \/\/ Form is invalid, handle the validation errors or display an error message\r\n    }\r\n    console.log(data.value);\r\n  }\r\n}<\/code><\/pre>\r\n<p>FOR Select dropdown<\/p>\r\n<p>component.ts<\/p>\r\n<pre class=\"language-markup\"><code>  subsForm_frequency:string ='0';<\/code><\/pre>\r\n<p>html<\/p>\r\n<pre class=\"language-markup\"><code>&lt;div class=\"col-4\"&gt;\r\n&lt;div class=\"form-select-wrapper mb-4\"&gt;\r\n  &lt;select class=\"form-select\" aria-label=\"Default select example\" name=\"frequency\"  [(ngModel)]=\"subsForm_frequency\"&gt;\r\n    &lt;option value=\"0\"&gt;Alert Frequency&lt;\/option&gt;\r\n    &lt;option value=\"1\"&gt;Daily&lt;\/option&gt;\r\n    &lt;option value=\"2\"&gt;Weekly&lt;\/option&gt;\r\n  &lt;\/select&gt;\r\n&lt;\/div&gt;\r\n&lt;\/div&gt;<\/code><\/pre>\r\n<p>Lets break down the code:<\/p>\r\n<p><strong>&lt;input&gt;<\/strong> element representing the email input field. It has the following attributes and directives:<\/p>\r\n<ul>\r\n<li><strong>required<\/strong>: Specifies that the field must be filled in before submitting the form.<\/li>\r\n<li><strong>email:<\/strong> Indicates that the input value should be a valid email address format.<\/li>\r\n<li>minlength=\"4\": Specifies the minimum length of the input value to be 4 characters.<\/li>\r\n<li>type=\"email\": Indicates that the input type is \"email\" to enable email-specific browser validation.<\/li>\r\n<li><strong>#email='ngModel':<\/strong> Declares a local template reference variable \"email\" and assigns it to the NgModel directive for the input field.<\/li>\r\n<\/ul>\r\n<p>To display the validation errors when the submit button is clicked, we use<\/p>\r\n<pre class=\"language-markup\"><code>(click)=\"myForm.form.markAllAsTouched()\"<\/code><\/pre>\r\n<p>&nbsp;<\/p>\r\n<p><strong>SAME PASSWORD VALIDATION<\/strong><\/p>\r\n<pre class=\"language-markup\"><code>&lt;input  type=\"password\" name=\"new_pass\" #new_pass='ngModel' ngModel  required=\"required\"&gt;\r\n&lt;input  type=\"password\" name=\"new_pass_cnf\" #new_pass_cnf='ngModel' ngModel  required=\"required\"&gt;\r\n&lt;div *ngIf=\"new_pass.value != new_pass_cnf.value\" class=\"alert alert-danger mt-2\"&gt;\r\n    Passwords don't match.\r\n&lt;\/div&gt;<\/code><\/pre>\r\n<p>&nbsp;<\/p>\r\n<p><strong>2. using Reactive form<br>&gt;&gt;simple form<\/strong><br>component.ts<\/p>\r\n<pre class=\"language-markup\"><code> \/*\r\n    Reactive forms provide a model-driven approach to handling form inputs whose values change over time.\r\n    1. app.module.ts\r\n      &gt; import { ReactiveFormsModule } from '@angular\/forms';\r\n      &gt; imports: [\r\n         ReactiveFormsModule\r\n       ],\r\n    2. inside component\r\n      import { FormControl } from '@angular\/forms';\r\n      \r\n    3. use inside template\r\n      &lt;label for=\"name\"&gt;Name: &lt;\/label&gt;\r\n      &lt;input id=\"name\" type=\"text\" [formControl]=\"name\"&gt;\r\n  *\/\r\n      name = new FormControl('inital value');\r\n\r\n    updateName() {\r\n      this.name.setValue('Nancy');\r\n    }<\/code><\/pre>\r\n<p>.html<\/p>\r\n<pre class=\"language-markup\"><code>&lt;label for=\"name\"&gt;Name: {{name.value}}&lt;\/label&gt;&lt;br\/&gt;\r\n&lt;input id=\"name\" type=\"text\" [formControl]=\"name\"&gt;\r\n&lt;button type=\"button\" (click)=\"updateName()\"&gt;Update Name&lt;\/button&gt;\r\n&lt;hr&gt;<\/code><\/pre>\r\n<p><strong>&gt;&gt; FORM GROUP<\/strong><\/p>\r\n<p>component.ts<\/p>\r\n<pre class=\"language-markup\"><code>    \/* form group: a form group instance tracks the form state of a group of form control instances (for example, a form).\r\n      1. import { FormGroup } from '@angular\/forms';\r\n      2. USE FormGroup\r\n      3. to save data (ngSubmit)=\"onSubmit()\" its  captures the current value of profileForm. Use EventEmitter to keep the form encapsulated and to provide the form value outside the component. \r\n\r\n    \r\n    *\/\r\n\r\n    profileForm = new FormGroup({\r\n      firstName: new FormControl(),\r\n      address: new FormGroup({\r\n        street: new FormControl('bhera'),\r\n        city: new FormControl(''),          \r\n      })\r\n    });\r\n    updateProfile() {\r\n      this.profileForm.patchValue({\r\n        firstName: 'Nancy',\r\n        address: {\r\n          street: '123 Drew Street'\r\n        }\r\n      });\r\n    }\r\n\r\n    onSubmit() {\r\n      console.warn(this.profileForm.value);\r\n    }\r\n<\/code><\/pre>\r\n<p>html<\/p>\r\n<pre class=\"language-markup\"><code>    &lt;h2&gt;FORM GROUP&lt;\/h2&gt;\r\n    &lt;form [formGroup]=\"profileForm\" (ngSubmit)=\"onSubmit()\"&gt;\r\n        &lt;label for=\"first-name\"&gt;First Name: &lt;\/label&gt;\r\n        &lt;input id=\"first-name\" type=\"text\" formControlName=\"firstName\"&gt;    \r\n        &lt;div formGroupName=\"address\"&gt;\r\n            &lt;h6&gt;Address&lt;\/h6&gt;          \r\n            &lt;label for=\"street\"&gt;Street: &lt;\/label&gt;\r\n            &lt;input id=\"street\" type=\"text\" formControlName=\"street\"&gt;          \r\n            &lt;label for=\"city\"&gt;City: &lt;\/label&gt;\r\n            &lt;input id=\"city\" type=\"text\" formControlName=\"city\"&gt;\r\n          &lt;\/div&gt;\r\n          &lt;button type=\"button\" (click)=\"updateProfile()\"&gt;Update Profile&lt;\/button&gt;\r\n        &lt;button type=\"submit\" [disabled]=\"!profileForm.valid\"&gt;Submit&lt;\/button&gt;\r\n      &lt;\/form&gt;\r\n      &lt;hr&gt;<\/code><\/pre>\r\n<p>&gt;&gt; create form using service<\/p>\r\n<p>component.ts<\/p>\r\n<pre class=\"language-markup\"><code>    \/**\r\n     * Creating form control instances manually can become repetitive when dealing with multiple forms. The FormBuilder service provides convenient methods for generating controls.\r\n     * 1. import { FormBuilder } from '@angular\/forms';\r\n     * 2. constructor(private fb: FormBuilder) { }\r\n     * 3. \r\n     *\/\r\n    constructor(private fb: FormBuilder) { }\r\n    serviceForm = this.fb.group({\r\n      username: [''],\r\n      \r\n      services: this.fb.group({\r\n        misaj: [''],\r\n        polish: [''],\r\n      }),\r\n    });<\/code><\/pre>\r\n<p>html<\/p>\r\n<pre class=\"language-markup\"><code>      &lt;h2&gt;SERVICE TO CREATE FORM&lt;\/h2&gt;    \r\n      &lt;form [formGroup]=\"serviceForm\"&gt;\r\n        &lt;label&gt;username: &lt;\/label&gt;\r\n        &lt;input type=\"text\" formControlName=\"username\"&gt;      \r\n        &lt;div formGroupName=\"services\"&gt;\r\n            &lt;h6&gt;services&lt;\/h6&gt;          \r\n            &lt;input placeholder=\"misaj\" type=\"text\" formControlName=\"misaj\"&gt;          \r\n            &lt;input placeholder=\"polish\" type=\"text\" formControlName=\"polish\"&gt;\r\n          &lt;\/div&gt;\r\n        &lt;button type=\"submit\" [disabled]=\"!serviceForm.valid\"&gt;Submit&lt;\/button&gt;\r\n      &lt;\/form&gt;<\/code><\/pre>\r\n<p>&gt;&gt; FORM VALIDATION<\/p>\r\n<p>component.ts<\/p>\r\n<pre class=\"language-markup\"><code>    \/*\r\n      form validation: \r\n      1.import { Validators } from '@angular\/forms'; \r\n      2. firstName: ['', Validators.required], \/\/make field required\r\n      3. &lt;p&gt;Form Status: {{ profileForm.status }}&lt;\/p&gt;\r\n    *\/\r\nexport class FormsComponent{\r\n     formValid = new FormGroup({\r\n        nameis: new FormControl('', [Validators.required, Validators.minLength(4),forbiddenNameValidator(\/bob\/i)]),\r\n      });\r\n}\r\n\r\nexport function forbiddenNameValidator(nameRe: RegExp): ValidatorFn {\r\n  return (control: AbstractControl): ValidationErrors | null =&gt; {\r\n    const forbidden = nameRe.test(control.value);\r\n    return forbidden ? {forbiddenName: {value: control.value}} : null;\r\n  };\r\n}\r\n<\/code><\/pre>\r\n<p>html<\/p>\r\n<pre class=\"language-markup\"><code> &lt;h2&gt;Form validation&lt;\/h2&gt;\r\n      &lt;form [formGroup]=\"formValid\"&gt;\r\n        &lt;label&gt;Name: &lt;\/label&gt;\r\n        &lt;input type=\"text\" formControlName=\"nameis\" &gt;\r\n        &lt;div *ngIf=\"formValid.controls.nameis.invalid &amp;&amp; (formValid.controls.nameis.dirty || formValid.controls.nameis.touched)\" class=\"alert alert-danger\"&gt;\r\n          &lt;div *ngIf=\"formValid.controls.nameis.errors?.['required']\"&gt;\r\n            Name is required.\r\n          &lt;\/div&gt;\r\n          &lt;div *ngIf=\"formValid.controls.nameis.errors?.['minlength']\"&gt;\r\n            Name must be at least 4 characters long.\r\n          &lt;\/div&gt;\r\n          &lt;div *ngIf=\"formValid.controls.nameis.errors?.['forbiddenName']\"&gt;\r\n            Name cannot be Bob.\r\n          &lt;\/div&gt;\r\n        &lt;\/div&gt; \r\n    &lt;p&gt;Form Status: {{ formValid.status }}&lt;\/p&gt;\r\n&lt;\/form&gt;<\/code><\/pre>","category_id":"13","is_private":"0","created_at":"2023-05-18T04:22:14.000000Z","updated_at":"2023-06-05T05:09:34.000000Z","category":{"id":13,"user_id":"1","name":"Angular","slug":"angular-rfjp","parent_id":"12","created_at":"2023-03-24T03:25:15.000000Z","updated_at":"2023-03-24T03:25:15.000000Z"},"user":{"id":1,"name":"R GONDAL","email":"rizikmw@gmail.com","email_verified_at":null,"two_factor_confirmed_at":null,"current_team_id":"1","profile_photo_path":null,"created_at":"2023-03-12T10:49:33.000000Z","updated_at":"2025-01-10T12:59:00.000000Z","profile_photo_url":"https:\/\/ui-avatars.com\/api\/?name=R+G&color=7F9CF5&background=EBF4FF"}},"pageDesc":"HTML CODE 1. &nbsp;using &nbsp;local template reference variable &lt;form class=\"contact-form needs-validation\"  novalidate #myForm=\"ngForm\" - Forms and form validation (Updated: June 5, 2023) - Read more about Forms and form validation at my programming site [SITE]","categories":[]}