You have first bind [(ngModel)]="firstOption"
in the form and later do the validation. No change event is required here
In component
file:
firstOption = '';
secondOption = '';
thirdOption = '';
fourthOption = '';
In template html file
<h4>Basic mat-select</h4>
<mat-form-field>
<mat-select placeholder="Type" [(ngModel)]="firstOption">
<mat-option
*ngFor="let type of typeColumn; let i = index"
[value]="{ type: type.text, index: i }"
[disabled]="
type.text === secondOption.type ||
type.text === thirdOption.type ||
type.text === fourthOption.type
"
>
{{ type.text }}
</mat-option>
</mat-select>
</mat-form-field>
<br />
<mat-form-field>
<mat-select placeholder="Type" [(ngModel)]="secondOption">
<mat-option
*ngFor="let type of typeColumn; let i = index"
[value]="{ type: type.text, index: i }"
[disabled]="
type.text === firstOption.type ||
type.text === thirdOption.type ||
type.text === fourthOption.type
"
>
{{ type.text }}
</mat-option>
</mat-select>
</mat-form-field>
<br />
<mat-form-field>
<mat-select placeholder="Type" [(ngModel)]="thirdOption">
<mat-option
*ngFor="let type of typeColumn; let i = index"
[value]="{ type: type.text, index: i }"
[disabled]="
type.text === secondOption.type ||
type.text === firstOption.type ||
type.text === fourthOption.type
"
>
{{ type.text }}
</mat-option>
</mat-select>
</mat-form-field>
<br />
<mat-form-field>
<mat-select placeholder="Type" [(ngModel)]="fourthOption">
<mat-option
*ngFor="let type of typeColumn; let i = index"
[value]="{ type: type.text, index: i }"
[disabled]="
type.text === secondOption.type ||
type.text === thirdOption.type ||
type.text === firstOption.type
"
>
{{ type.text }}
</mat-option>
</mat-select>
</mat-form-field>
<br />