Угловой: как выбрать по умолчанию первый элемент в выборе, когда используется сложный объект

#javascript #angular #typescript #data-binding #drop-down-menu

Вопрос:

Я разрабатываю веб-приложение с использованием Angular 11. Компонент получает массив с объектом через входные данные:

 [
   {propery1: "a", property2:"b"},
   {propery1: "c", property2:"d"},
   {propery1: "e", property2:"f"},
]
 

Итак, в файле my_component.ts у меня есть:

 @Input() myArray: any[];
private selectedObject: any; // The current object selected with all its properties!
 

Я хотел бы selectedObject , чтобы весь объект (массива) был выбран через выпадающее меню. Я сделал это вот так:

 <select [(ngModel)]="selectedObject">
    <option *ngFor="let object of myArray;" [ngValue]="object">{{object.property1}}</option>
</select>
 

Значение selectedObject связано с текущим значением object . Я получил то, что хотел, но я не могу понять, почему выпадающий список появляется на экране без выбранных параметров:

введите описание изображения здесь

Если я открою меню, результаты появятся, как и ожидалось:

введите описание изображения здесь

И если я выберу свойство, «пустое свойство» исчезнет:

введите описание изображения здесь

Я бы хотел, чтобы этого не случилось. Я бы хотел 'a' , чтобы значение было видно с самого начала. Этого можно легко достичь, изменив значение ngValue с object.property1 . Но таким образом, привязка не будет работать так, как я хочу ( selectedObject должен быть полный объект и ни одно свойство). Как сделать так, чтобы первое свойство появилось без возникновения этой проблемы?

Ответ №1:

В вашем файле .ts :

   myArray = [
    {property1: "a", property2:"b"},
    {property1: "c", property2:"d"},
    {property1: "e", property2:"f"},
 ]
 public selectedValue: string 
 public selectedObject: any

 ngOnInit() {
   this.selectedValue = this.myArray[0].property1
   this.onValueChange();
 }

 onValueChange() {
   const found = this.myArray.filter( obj => obj.property1 === this.selectedValue)
   this.selectedObject = found? found[0] : {}
 }
 

В файле you .html

 <select [(ngModel)]="selectedValue" (ngModelChange)="onValueChange()">
<option *ngFor="let item of myArray"
        [value]="item.property1">{{item.property1}}</option>
</select>

<p>selectedvalue : {{selectedValue}}</p>

<p *ngIf="selectedObject">selected object : {{selectedObject.property1}} ; {{selectedObject.property2}}</p>