Свойство привязки к объекту не работает в Angular 2

У меня очень странное поведение с привязкой свойства Angular 2.

Во-первых, это класс Store:

export class Store {
    id: number;
    name: string;
    address: string;
}

Это код компонента:

export class MyBuggyComponent implements OnInit {

  stores: Store[];
  selectedStore: any;
  error: any;

  constructor(private myDataService: MyDataService) { }

  ngOnInit() {
    this.myDataService.getStores().subscribe(
      stores => this.stores = stores,
      error => { this.error = error; console.log(this.error); });
  }

  selectionChanged(value: any){
    console.log("DEBUG: " + value);
  }
}

И вот шаблон, который сводит меня с ума!

<form>
  <div class="form-group">
    <label for="store">Select store:</label>
    <select class="form-control custom-select" id="store" name="store" required 
      [(ngModel)]="selectedStore" (change)="selectionChanged($event.target.value)">
      <option *ngFor="let s of stores" [value]="s">{{s.name}}</option>
    </select>
    <small class="form-text text-muted" *ngIf="selectedStore">Address: {{selectedStore.address}}</small>
  </div>
</form>

Здесь обязательна [value]="s" из option из <select> тег просто не работает! Это устанавливает selectedStore к некоторому пустому объекту (?), он отображает пустой Address: текст в <small> тег, и это журналы: DEBUG: [object Object] в консоли (в selectionChanged()). Но {{s.name}} Интерполяция работает как положено (отображает имена внутри поля выбора).

Теперь посмотрите на это: если я сделаю следующую модификацию шаблона, он будет работать как положено:

  <option *ngFor="let s of stores" [value]="s.address">{{s.name}}</option>
</select>
<small class="form-text text-muted" *ngIf="selectedStore">Address: {{selectedStore}}</small>

Теперь привязка работает, адрес зарегистрирован в консоли, а также отображается в <small> пометить правильно. Так что связывание [value]="s" не работает (на самом деле дает какое-то странное значение 'object'), но привязка [value]="s.address" работает как положено. Я следовал за документами, и нет никаких упоминаний о таком ограничении. Это ошибка? Или я что-то упустил?

2 ответа

Решение

[value] поддерживает только строковые значения в качестве связанного значения. использование [ngValue] вместо этого он может связывать объекты.

У меня та же проблема, вы можете попробовать мое решение:

<select class="form-control custom-select" id="store" name="store" required 
  [(ngModel)]="selectedStore" (change)="selectionChanged($event.target.value)">
  <option *ngFor="let s of stores; let i = index" value="{{i}}">{{s.name}}</option>
</select>

// .ts
selectionChanged(value: any){
   // this.selectedStore = position in stores
   console.log(this.stores[this.selectedStore]);
}
Другие вопросы по тегам