Using Angular ControlValueAccessor interface
This topic will go over how to use Smart CheckBox component and use ngModel forms and Reactive Forms.
1. Creating the Component smart-input.component.ts
import { Component, Input, forwardRef } from '@angular/core'; import { ControlValueAccessor, NG_VALUE_ACCESSOR, NG_VALIDATORS, FormControl, Validator } from '@angular/forms'; @Component({ selector: 'smart-input', template: ` <smart-check-box [checked]="value" (change)="onChange($event)" (keyup)="onChange($event)"> </smart-check-box> `, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SmartInputComponent), multi: true, }, { provide: NG_VALIDATORS, useExisting: forwardRef(() => SmartInputComponent), multi: true, }] }) export class SmartInputComponent implements ControlValueAccessor, Validator { private value: boolean; private data: any; // this is the initial value set to the component public writeValue(obj: any) { if (obj) { this.data = obj; this.value = this.data; } } // registers 'fn' that will be fired wheb changes are made // this is how we emit the changes back to the form public registerOnChange(fn: any) { this.propagateChange = fn; } // validates the form, returns null when valid else the validation object // in this case we're checking if the smart parsing has passed or failed from the onChange method public validate(c: FormControl) { return true; } // not used, used for touch input public registerOnTouched() { } // change events from the checkbox private onChange(event) { // get value from checkbox let newValue = event.target.checked; this.data = newValue; // update the form this.propagateChange(this.data); } // the method set in registerOnChange to emit changes back to the form private propagateChange = (_: any) => { }; }
2. Creating smart-input.module.ts
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { CommonModule } from '@angular/common'; import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { SmartInputComponent } from './smart-input.component'; @NgModule({ imports: [ CommonModule, FormsModule, ], schemas: [ CUSTOM_ELEMENTS_SCHEMA ], exports: [ SmartInputComponent, ], declarations: [ SmartInputComponent, ], providers: [], }) export class SmartInputModule { }
3. Creating app.module.ts
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { FormsModule,ReactiveFormsModule } from '@angular/forms'; import { SmartInputModule } from './smart-input.module'; import { AppComponent } from './app.component'; import '@smarthtmlelements/smart-core/source/smart.core.js'; @NgModule({ declarations: [AppComponent], imports: [BrowserModule, FormsModule, ReactiveFormsModule, SmartInputModule], schemas: [ CUSTOM_ELEMENTS_SCHEMA ], providers: [], bootstrap: [AppComponent] }) export class AppModule { }
4. Creating app.component.ts
import { Component, OnInit } from '@angular/core'; import { FormGroup, FormBuilder } from '@angular/forms'; export class Hero { id: number; name: string; } @Component({ selector: 'app-root', template: ` <h1>NgModel</h1> <form #form="ngForm"> <smart-input [(ngModel)]="result" name="result"></smart-input> </form> <p>form is valid: {{ form.valid ? 'true' : 'false' }}</p> <p>Value:</p> <pre>{{ result}}</pre> <h1>Reactive Form</h1> <form [formGroup]="reactiveForm"> <smart-input formControlName="result"></smart-input> </form> <p>form is valid: {{ reactiveForm.valid ? 'true' : 'false' }}</p> <p>Value:</p> <pre>{{ reactiveForm.value | json}}</pre> ` }) export class AppComponent { public result = {}; public reactiveForm: FormGroup; constructor(private fb: FormBuilder) { this.result = true; this.reactiveForm = this.fb.group({ result: true; }) } }
Result:
Note: In the package.json, you should include a dependency to Smart's npm package. Ex: "@smarthtmlelements/smart-core": "2.0.0"
Download our example from here:
angular-controlvalueaccessor-sample.zip.