Angular - выбранный параметр не фиксируется в объекте ngForm

Отредактировано для удаления нерелевантного кода.

Я пытаюсь распечатать объект формы на консоли, но выбранный параметр не отображается. В консоли он отображается как undefined.

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

Коды я поместил ниже. Если кто-то может подсказать, что не так с этим конкретным кодом, это будет полезно. Сообщите мне, если потребуется дополнительная информация.

Component.html:

<form #f="ngForm" (ngSubmit)="save(f.value)">

....

  <div class="form-group">
    <label for="category">Category</label>
    <select ngModel name="category" id="category" class="form-control">
      <option value=""></option>
      <option *ngFor="let c of categories$ | async" [value]="c.key">
        {{ c.name }}
      </option>
    </select>
  </div>

....

Component.ts:

import { CategoryService } from './../../category.service';

....

export class ProductFormComponent implements OnInit {

  categories$;

  constructor(categoryService: CategoryService) {
    this.categories$ = categoryService.getCategories();
  }

  save(product) {
    console.log(product);
  }

....

Category.Service.ts:

import { AngularFireDatabase } from 'angularfire2/database';

....

  getCategories() {
    return this.db
      .list('/categories', ref => ref.orderByChild('name'))
      .valueChanges();
  }

....

Я хочу, чтобы значение, выделенное из базы данных Firebase, было записано в объекте. Если я поставлю c.name, я получаю удобное для пользователя имя.

Структура базы данных Firebase.


person Rijaz Ali    schedule 21.05.2018    source источник
comment
есть ли в коллекции categories свойство .key?   -  person Pankaj Parkar    schedule 21.05.2018
comment
Это запись в базе данных firebase. Я считал, что у него свойство .key. Я тоже пробовал с ключом. $. Я обновил вопрос, чтобы указать, какое значение я хочу зафиксировать.   -  person Rijaz Ali    schedule 22.05.2018
comment
Возможно, вам стоит немного сократить вопрос. Слишком много нерелевантного кода.   -  person Dawid Zbiński    schedule 22.05.2018
comment
@ DawidZbiński Да, я все еще привыкаю задавать вопросы. Я не был уверен, в чем проблема, и обычно вижу комментарии от других, которые говорят, что нужно опубликовать больше кода, чтобы прояснить дальнейшие действия. Я проявил осторожность и разместил здесь большую часть связанного кода.   -  person Rijaz Ali    schedule 22.05.2018
comment
@ DawidZbiński Я отредактировал его в соответствии с вашим предложением. Спасибо за комментарий.   -  person Rijaz Ali    schedule 22.05.2018


Ответы (2)


Я нашел ответ по ссылке ниже. Вместо .valueChanges() мы должны использовать .snapshotChanges(), поскольку первый возвращает Observable без каких-либо метаданных.

Обновление до AngularFire 5.0

Обновленные файлы с изменениями представлены ниже.

Category.service.ts: valueChanges() изменен на snapshotChanges().

import { AngularFireDatabase } from 'angularfire2/database';

....

  getCategories() {
    return this.db
      .list('/categories', ref => ref.orderByChild('name'))
      .snapshotChanges();
  }

....

Component.html: в параметре выбора интерполяции изменено c.name на c.payload.val().name.

<form #f="ngForm" (ngSubmit)="save(f.value)">

....

  <div class="form-group">
    <label for="category">Category</label>
    <select ngModel name="category" id="category" class="form-control">
      <option value="blank"></option>
      <option *ngFor="let c of categories$ | async" [value]="c.key">
        {{ c.payload.val().name }}
      </option>
    </select>
  </div>

....
person Rijaz Ali    schedule 22.05.2018

person    schedule
comment
Нет объекта. Это для firebase, и я просто пытаюсь напечатать объект ngForm на консоли. Я попробовал то, что вы сказали, но это не сработало. - person Rijaz Ali; 22.05.2018