Установите первоначально выбранный элемент в списке выбора в Angular2

Мне удалось получить список Select для привязки к моей модели с целью сохранения, но я не могу решить, как заставить Angular2 автоматически выбрать правильный вариант в списке Select, если я предоставляю функции редактирования. Другими словами, если я редактирую существующий объект через форму, мне нужен список выбора, чтобы отразить начальное состояние объекта (например, вариант 5 в списке выбора), а не просто по умолчанию для первого элемента,

<select [ngModel]="originalObject">
    <option *ngFor="let object of objects" [ngValue]="object">{{object.name}}</option>
</select>

Как я думаю, это должно сработать, но нет!

<select [ngModel]="originalObject">
    <option *ngFor="let object of objects" [ngValue]="object" [selected]="object === originalObject">{{object.name}}</option>
</select>

Поэтому, по сути, я пытаюсь использовать свойство "selected" на опции, но по какой-то причине он ничего не делает. "SelectedObject" в этом случае будет объектом в компоненте, который он может прочитать.

Ответ 1

Хорошо, поэтому я понял, в чем проблема, и подход, который, как я считаю, работает лучше всего. В моем случае, поскольку два объекта не были идентичны с точки зрения Javascript, как в: они могут иметь одни и те же значения, но они были разными фактическими объектами, например, originalObject был создан полностью отдельно от objects который был по существу массивом ссылки данных (для заполнения раскрывающегося списка).

Я обнаружил, что подход, который лучше всего работал для меня, состоял в том, чтобы сравнить уникальное свойство объектов, а не напрямую сравнивать два целых объекта. Это сравнение выполняется в selected связанном свойстве:

<select [ngModel]="originalObject">
    <option *ngFor="let object of objects" [ngValue]="object" [selected]="object.uniqueId === originalObject.uniqueId">{{object.name}}</option>
</select>

Ответ 2

Обновление до угловой 4.XX, есть новый способ отметить выбранную опцию:

<select [compareWith]="byId" [(ngModel)]="selectedItem">
  <option *ngFor="let item of items" [ngValue]="item">{{item.name}}
  </option>
</select>

byId(item1: ItemModel, item2: ItemModel) {
  return item1.id === item2.id;
}

Некоторый учебник здесь

Ответ 3

Если вы используете

<select [ngModel]="object">
    <option *ngFor="let object of objects" [ngValue]="object">{{object.name}}</option>
</select>

Вам необходимо установить object свойства в вашем классе компонентов для элемента из objects которые вы хотите предварительно выбрать.

class MyComponent {
  object;
  objects = [{name: 'a'}, {name: 'b'}, {name: 'c'}];
  constructor() {
    this.object = this.objects[1];
  }
}

Ответ 4

Вы можете добиться того же

<select [ngModel]="object">
  <option *ngFor="let object of objects;let i= index;" [value]="object.value" selected="i==0">{{object.name}}</option>
</select>

Ответ 5

Будет ли это работать, если вы просто удалите отредактированный элемент из массива и нажмите его в начале массива, чтобы он был автоматически выбран?

Ответ 6

Надеюсь это кому-нибудь поможет! (работает на Angular 6)

Мне пришлось динамически добавлять множество select/options, и у меня сработало следующее:

<div *ngFor="let option of model.q_options; let ind=index;">

        <select 
          [(ngModel)]="model.q_options[ind].type" 
          [ngModelOptions]="{standalone: true}"
        > 
          <option 
            *ngFor="let object of objects" 
            [ngValue]="object.type" 
            [selected]="object.type === model.q_options[ind].type"
          >{{object.name}}
          </option>
        </select> 

        <div [ngSwitch]="model.q_options[ind].type">
          ( here <div *ngSwitchCase="'text' or 'imagelocal' or etc."> is used to add specific input forms )
        </div>
</div>

и в *.ts

// initial state of the model
// q_options in html = NewOption and its second argument is option type
model = new NewQuestion(1, null, 2, 
  [
    new NewOption(0, 'text', '', 1), 
    new NewOption(1, 'imagelocal', '', 1)
  ]);

// dropdown options
objects = [
    {type: 'text', name: 'text'},
    {type: 'imagelocal', name: 'image - local file'},
    {type: 'imageurl', name: 'image URL'}
   ( and etc.)
];

Когда пользователь добавляет еще одну "опцию ввода" (пожалуйста, не путайте "опцию ввода" с select/options - select/options здесь static), конкретный select/option, выбранный пользователем ранее, сохраняется для каждого/все динамически добавляются " опция ввода выберите/опции.

Ответ 7

Самый простой способ решить эту проблему в Angular - это:

В шаблоне:

<select [ngModel]="selectedObjectIndex">
  <option [value]="i" *ngFor="let object of objects; let i = index;">{{object.name}}</option>
</select>

В вашем классе:

this.selectedObjectIndex = 1/0/your number wich item should be selected