Я использую библиотеку angular7 ng-select для реализации элемента управления select. Я использую Angular CLI для разработки. Я пытаюсь предотвратить распространение события, когда происходит событие изменения. Я обнаружил, что в этом случае нельзя предотвратить распространение события изменения.
Обходным путем было бы установить выбранное значение программно.
Итак, в моем элементе управления ng-select установлено свойство [(ngModel)] = "selectedOption".
В моем файле машинописи в функции, вызванной событием изменения, я установил ранее выбранное значение, чтобы предотвратить любые изменения в выбранной опции.
Но это значение не отражается в элементе управления ng-select.
Я также попытался обнаружить изменения, используя ChangeDetectorRef.
ng-select HTML:
<ng-select [items]="selectOptions" bindValue="value"
[(ngModel)]="selectedOption" (change)="onChangeOption($event)">
<ng-template ng-label-tmp let-item="item">
<img [src]="item.iconOption" /> {{ item.text }}
</ng-template>
<ng-template ng-option-tmp let-item="item">
<img [src]="item.iconOption" class="pr-3" />{{ item.text }}
</ng-template>
</ng-select>
Полный код файла TS:
export class SampleComponent implements OnInit, OnChanges {
@Input() reportStatus: string;
selectOptions: any[];
selectedOption: string;
previousSelectedOption: string;
constructor() {}
ngOnInit() {
this.selectedOption = this.reportStatus;
this.previousSelectedOption = this.reportStatus;
this.selectOptions = [
{
id: '1',
value: 'draft',
iconOption: '../../../assets/images/Draft.svg',
text: 'Draft'
},
{
id: '2',
value: 'approved',
iconOption: '../../../assets/images/Approved.svg',
text: 'Approved'
},
{
id: '3',
value: 'completed',
iconOption: '../../../assets/images/Completed.svg',
text: 'Completed'
},
{
id: '4',
value: 'cancelled',
iconOption: '../../../assets/images/Cancelled.svg',
text: 'Cancelled'
}
];
}
onChangeOption(event) {
// cannot change status if current status is completed
// reset to previous selected value
if (this.previousSelectedOption === 'completed') {
this.selectedOption = this.previousSelectedOption;
return;
}
this.previousSelectedOption = event.value;
}
}
Я ожидаю, что выбранное значение в элементе управления ng-select будет сброшено к предыдущему значению. Но новое измененное значение устанавливается независимо.
Я попробовал принятое решение отсюда:
установить выбранное значение в angular5 ng-select программно
Но я хочу знать, есть ли более простой подход к этому. Кроме того, у меня есть несколько элементов управления ng-select на моей странице, поэтому использование ViewChild будет проблематичным.