Checkbox List With Material Angular

We make a checkbox list component in angular using material angular MatCheckbox component. When used as model this list will return the list selected checkbox values

Checkbox List Screenshot

Implemetation

import { Component, OnInit, Input, forwardRef } from "@angular/core";
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';

@Component({  
   selector: 'db-mat-checkbox-list',
   template: `   
   <div [id]="dbmatcbId" class='cb-list'>
     <div class="cb-warpper" *ngFor="let opt of options; let i = index">
       <mat-checkbox [name]="opt" [value]="opt" [(ngModel)]="selectedModel[opt]" (change)="onChange($event)"></mat-checkbox>
     </div>
   </div>  
   `,
    styles: [`
    .cb-list {
        display: flex;
        padding: 10px;
    }
    .cb-warpper{
        width: 20%;
        min-width: 60px;
    }
    `],
    providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DBMatCheckboxListComponent), multi: true }]
})
export class  DBMatCheckboxListComponent implements OnInit, ControlValueAccessor{
  dbmatcbId = `dbmat-checkbox-list-${idctr++}`;
  @Input() options: string[];

  private _innerValue: string[];

  selectedModel: { [s: string]: boolean; } = {};
  
  ngOnInit(): void {
    // Setting the initial value as false
    this.options.forEach(e => this.selectedModel[e] = false);
  }

  writeValue(obj: any): void {
    this._innerValue = obj;
    if (this._innerValue) {
      this._innerValue.forEach(e => this.selectedModel[e] = true);
      this._controlValueAccessorChangeFn(obj);
    }
  }

  onChange() {
    this._innerValue = Object.keys(this.selectedModel).filter(k =>   this.selectedModel[k]);
    this._controlValueAccessorChangeFn(this._innerValue);
  }
  
  registerOnChange(fn: any): void {
    this._controlValueAccessorChangeFn = fn;
  }

  registerOnTouched(fn: any): void {
    this._onTouched = fn;
  }

  setDisabledState?(isDisabled: boolean): void {
    // throw new Error("Method not implemented.");
  }
  // Defaulf noop 
  private _controlValueAccessorChangeFn: (value: any) => void = () => { };
  private _onTouched: () => any = () => { };

  
}
let idctr = 0;

This is component is ready to used array of string and display list of checkboxes and will return only the select list string

Using new checkbox list

import { Component, OnInit } from '@angular/core';

@Component({
    selector: 'sample-cb-list',
    template: `
    <div>
        <db-mat-checkbox-list [options]="optionslist" name="cblist" [(ngModel)]="cblist"></db-mat-checkbox-list>
    </div>
    <div><button (click)="display()">Display</button></div>
    <div></div>
    `,
    styles: [``]
})
export class SampleCBCListComponent implements OnInit {

    optionslist: string[] = [];

    cblist: string[] = [];

    constructor() {}

    ngOnInit(): void {
        this.optionslist = ['Apple', 'Orange', 'Grapes']
    }


    display() {
      console.log('selected ', this.cblist);
    }
} 

Enjoy your new checkbox list

App Url @stackblitz.io https://angular-4hm6ja.stackblitz.io