Ионный выбор всего объекта ngModel

#angular #ionic-framework #angular-ngmodel #ionic4

#angular #ионный фреймворк #angular-ngmodel #ionic4

Вопрос:

Мой код выглядит следующим образом:

 <ion-select [(ngModel)]="current_language" okText="Okay" cancelText="Dismiss" (ionChange)="changeLanguage()">
    <ion-select-option *ngFor="let language of languages" [value]="language">{{language.name}}
    </ion-select-option>
  </ion-select>
  

когда я выбираю один из них и нажимаю «Ок» в файле .ts current_language , это именно то, что я выбрал. но проблема в том, что я думаю, что другой способ привязки не работает. потому что изначально current_language не выбирается при входе на страницу.

это мой язык:

 Language{
id: number;
name: string;
flag: string;
code: string;
status: number;
  

}

итак, что я должен сделать, чтобы иметь двустороннюю привязку Language объекта? Потому что мне нужен весь Language объект, который был выбран.

Ответ №1:

вы должны установить его в select:

 <ion-item>
      <ion-label>Language</ion-label>
      <ion-select [(ngModel)]="current_language">
          <ion-option *ngFor="let language of languages; let i = index" [value]="language" [selected]="i === 0"> // selects first item
              {{language.name}} 
          </ion-option>
      </ion-select>
  </ion-item>
  

или присвоите значение вашей ngModel одному из элементов вашего массива:

 <ion-item>
      <ion-label>Language</ion-label>
      <ion-select [(ngModel)]="current_language">
          <ion-option *ngFor="let language of languages;" [value]="language">
              {{language.name}} 
          </ion-option>
      </ion-select>
  </ion-item>
  

в ts:

 current_language = this.languages[0]; // selects first item
  

Обновить:
если вы получаете текущее хранилище языковых форм:

 ngOnInit(){
    let fromStore: Language =  {name: 'second' , id:1};
    let index: number = this.languages.findIndex(item => item.id === fromStore.id);
    this.current_language = this.languages[index];
  }
  

проверьте ДЕМОНСТРАЦИЮ.

Комментарии:

1. но я получаю current_language из хранилища, так что это. языки [0] будут неправильными, ни [selected]=»i === 0″

2. что такое хранилище? :)) вы имеете в виду получить его асинхронно с сервера?

3. Хорошо, теперь я знаю, вы должны получить get current language из хранилища и найти его в своем массиве languages, затем найти индекс и присвоить его current_language.

4. @O.Shekriladze сейчас я обновил ответ и демонстрационную проверку.

5. Спасибо @Fateme Fazli , [(ngModel)]=»prog» (ionChange)=»progChange(prog)»

Ответ №2:

Используйте CompareWith для выбора значения по умолчанию. Также обратите внимание на использование [(value)]

В шаблоне добавьте:

 <ion-select [(ngModel)]="current_language" okText="Okay" cancelText="Dismiss" (ionChange)="changeLanguage()" [compareWith]="compareObjects">
    <ion-select-option *ngFor="let language of languages" [(value)]="language">{{language.name}}
    </ion-select-option>
  </ion-select>
  

В файл ts компонента добавьте функцию:

 compareObjects(o1: any, o2: any): boolean {
return o1._id === o2._id;//Compare by id
}
  

В этой реализации используется сравнение с помощью Id , вы можете использовать любые другие свойства или комбинацию свойств.

Комментарии:

1. в нем говорится: не удается выполнить привязку к ‘CompareWith’, поскольку это неизвестное свойство ‘ion-select’.