Website-Suche

html - Daten werden in Angular 7 nicht von Firebase abgerufen


Ich möchte einen Datensatz aus der Firebase-Datenbank abrufen und meine Dropdown-Liste füllen. Aber es wird nichts angezeigt. Ich habe viel recherchiert, aber ich kann das Problem immer noch nicht beheben. Ich verwende Angular 7.

ERROR Error: "Cannot find a differ supporting object 'function (events) {
            var snapshotChanges$ = Object(_snapshot_changes__WEBPACK_IMPORTED_MODULE_0__["snapshotChanges"])(query, events);
            return afDatabase.scheduler.keepUnstableUntilFirst(afDatabase.scheduler.runOutsideAngular(snapshotChanges$)).pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_5__["map"])(function (actions) { return actions.map(function (a) { return a.payload.val(); }); }));
        }' of type 'valueChanges'. NgFor only supports binding to Iterables such as Arrays."

category.service.ts

import { Injectable } from '@angular/core';
import { AngularFireDatabase } from 'angularfire2/database';

@Injectable()
export class CategoryService {

  constructor(private db: AngularFireDatabase) { }

  getCategories(){

    return this.db.list('/categories').valueChanges;//get categories list in database and return it
  }
}

produkt-formular.komponente.ts

import { Component, OnInit } from '@angular/core';
import { CategoryService } from 'src/app/category.service';
import { ProductService } from 'src/app/product.service';
import { Router } from '@angular/router';

@Component({
  selector: 'app-product-form',
  templateUrl: './product-form.component.html',
  styleUrls: ['./product-form.component.css']
})
export class ProductFormComponent implements OnInit {

  categories$;

  constructor(private router: Router, private categoryService: CategoryService, private productService: ProductService) { 
    this.categories$ = categoryService.getCategories();
  }

Codeabschnitt, der mit dem Problem in product-from.component.html zusammenhängt

 <div class="form-group">
      <label for = "category">category</label>

      <select #category="ngModel" ngModel name="category" id ="category"class="form-control" required>
          <option value=""></option>
          <option *ngFor="let cate of categories$" [value]=" cate.$key ">{{ cate.name }}</option>
       </select>

       <div class="alert alert-danger" *ngIf="category.touched && category.invalid">Category is required.
       </div>
</div>

So sieht meine Datenbank aus

Antwort #1

So sieht meine Datenbank aus

Wahrscheinlich liegt das Problem an Ihrem Datenbankdesign. Versuchen Sie, es vom objektbasierten Design auf ein Array-Design wie folgt zu ändern.

Exportieren Sie die JSON-Datei von Firebase und ändern Sie die Kategorien in ein Array. Es wird also wie unten aussehen.

"Categories": [
    { "name":"Bread"},
    { "name":"Dairy" },
    { "name":"Fruits" },
    .....
    .....
    .....
  ]

Importieren Sie die modifizierte JSON in Firebase.

Antwort #2

Ändern Sie die getCatergories()-Methode wie folgt:

getCategories() {
return this.db
  .list('/categories', (ref) => ref.orderByChild('name'))
  .snapshotChanges()
  .pipe(
    map((actions) => {
      return actions.map((action) => ({
        key: action.key,
        val: action.payload.val(),
      }));
    })
  );

}

und rufen Werte in HTML wie folgt auf:

<option *ngFor="let c of categories$|async" [value]="c.key">
    {{c.val.name}}
</option>

Quelle: Konnte $key nicht aus Firebase im Angular5-Template abrufen

Verwandte Artikel