'error message from angular validation system it does not working

I tried to manage validation system using angular in dropdownlist, I created a form contains a dropdownlist and a button, I want when I click on the button without choosing element in dropdownlist, it show a message fields is required, in my example it hides only message and when I click on button there is nothing to show.

validation.component.html

<form #formClient="ngForm"> 
                <div class="form-group">
                    <select name="category_id" [(ngModel)]="annonce.category_id" #category_id="ngModel" class="form-control" [ngClass]="{ 'is-invalid': category_id.errors }" required>
                        <option selected disabled></option>
                        <option [ngValue]="1">najib</option>
                        <option [ngValue]="2">ali</option>
                    </select>
                    <div [hidden]="!category_id.errors?.required" class="invalid-feedback">
                        category_id is required
                    </div>
                </div>
                <input type="submit" class="btn btn-primary" value="Partager Annonce">
            </form> 

validation.component.ts

 annonce : Annonce = {
    category_id:0,
  }
  constructor() { }
  ngOnInit(): void {
  }

annonce.ts

export interface Annonce{
    category_id:number,
}


Solution 1:[1]

You can achieve this using angular ReactiveForms easily

Import ReactiveFormsModule In App.Module.ts

import { NgModule } from '@angular/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    ReactiveFormsModule 
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

validation.component.ts

import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';

@Component({
  selector: 'app-validation',
  templateUrl: './validation.component.html',
  styleUrls: ['./validation.component.css']
})
export class ValidationComponent implements OnInit {

  appValForm: FormGroup;
  submitted: boolean = false;
  constructor(public fb:FormBuilder) { 
  }    
  ngOnInit(): void {
    this.appValForm = this.fb.group({
      categoryId:['',[Validators.required]]
    })
  }
  get controls() {
    return this.appValForm.controls;
  }
  submit() {
    this.submitted = true;
  }
}

validation.component.html

<form [formGroup]="appValForm"> 
    <div class="form-group">
        <label>select category</label>
        <select formControlName="categoryId">
            <option selected disabled>Select</option>
            <option [value]="1">najib</option>
            <option [value]="2">ali</option>
        </select>
        <ng-container *ngIf="controls.categoryId?.errors">
            <small *ngIf="controls.categoryId?.errors.required && submitted">Input is required</small>
        </ng-container>
    </div>
    <button type="button" class="btn btn-primary" (click)="submit()" >Submit</button>
</form> 

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Shakir