@ Ответ Челлаппана совершенно верен, но есть несколько других проблем с вашим кодом, которые я хотел бы решить. Во-первых, в расчете на c, value
всегда будет иметь тип string
. Таким образом, this.ScheduleDataObj.modeOfTransportID === 0
всегда будет ложным, потому что оно должно быть === '0'
. Однако вы можете исправить это, используя ngValue . Из документов (выделено мое):
ngValue: отслеживает значение, связанное с элементом option. В отличие от привязки значения, ngValue поддерживает привязку к объектам.
Таким образом, вы можете реорганизовать ваше представление для использования ngValue
, и ваш код будет работать:
<select class="form-control"
[(ngModel)]="ScheduleDataObj.modeOfTransportID"
name="modeOfTransportID"
#modeOfTransportID="ngModel"
(change)="ModeValueChange($event)">
<option [ngValue]="0">Select Mode</option>
<option [ngValue]="1">Some Mode</option>
</select>
Кроме того, вместо того, чтобы думать о просмотре значения в терминах событий html (что может оказаться непростым делом, поскольку значение вашей модели может измениться не совсем точно, если вы думаете, что это так), вы можете реорганизовать код для просмотра FormControl
сам для изменения стоимости. Обязательно дождитесь окончания инициализации представления, чтобы ваш @ViewChild
ref не был нулевым:
ngAfterViewInit() {
// Watch our modeID value changes.
// Using takeUntil to avoid memory leaks.
this.modeID.valueChanges
.pipe(takeUntil(this.unsubscribe))
.subscribe(value => {
if (value === 0) {
// Note: this will remove other validation errors.
// If that is not desired behavior, see this discussion:
// https://github.com/angular/angular/issues/21564
this.modeID.control.setErrors({ invalid: true });
} else {
// This also removes *all* errors, which might not
// be desired behavior.
this.modeID.control.setErrors(null);
}
});
}
Собрав все вместе, вот рабочий пример работы над stackblitz . Вы также можете просто создать собственный валидатор для этого.