Угловой 4: InvalidPipeArgument: '[объект объекта] 'для трубы 'AsyncPipe'

мне нужна ваша помощь, я пытаюсь отобразить некоторые данные из моей firebase, но это trhows меня ошибка, как InvalidPipeArgument: '[object Object]' for pipe 'AsyncPipe'.


есть моя служба:

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

@Injectable()
export class MoviesService {

  constructor(private db: AngularFireDatabase) {}
  get = () => this.db.list('/movies');
}

есть мой компонент:

import { Component, OnInit } from '@angular/core';
import { MoviesService } from './movies.service';

@Component({
  selector: 'app-movies',
  templateUrl: './movies.component.html',
  styleUrls: ['./movies.component.css']
})
export class MoviesComponent implements OnInit {
  movies: any[];

  constructor(private moviesDb: MoviesService) { }

  ngOnInit() {
    this.moviesDb.get().subscribe((snaps) => {
      snaps.forEach((snap) => {
        this.movies = snap;
        console.log(this.movies);
      });
   });
 }
}

и есть мопс:

ul
  li(*ngFor='let movie of (movies | async)')
    | {{ movie.title | async }}

5 ответов


в вашем MoviesService вы должны импортировать FirebaseListObservable, чтобы определить тип возврата FirebaseListObservable<any[]>

import { AngularFireDatabase, FirebaseListObservable } from 'angularfire2/database';

тогда метод get () должен выглядеть так-

get (): FirebaseListObservable<any[]>{
        return this.db.list('/movies');
    }

этот метод get () вернет FirebaseListObervable списка фильмов

в вашем MoviesComponent должен выглядеть так

export class MoviesComponent implements OnInit {
  movies: any[];

  constructor(private moviesDb: MoviesService) { }

  ngOnInit() {
    this.moviesDb.get().subscribe((snaps) => {
       this.movies = snaps;
   });
 }
}

затем вы можете легко перебирать фильмы без асинхронного канала, поскольку данные mivies[] не являются наблюдаемым типом, ваш html должен нравиться это и твой HTML должен быть таким

ul
  li(*ngFor='let movie of movies')
    {{ movie.title }}

если вы declear фильмы как

movies: FirebaseListObservable<any[]>;

тогда вы должны просто позвонить

movies: FirebaseListObservable<any[]>;
ngOnInit() {
    this.movies = this.moviesDb.get();
}

и ваш HTML должен быть таким

ul
  li(*ngFor='let movie of movies | async')
    {{ movie.title }}

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


вы получаете это сообщение, когда вы использовали async в своем шаблоне, но ссылаетесь на объект, который не является наблюдаемым.

Итак, для примера, скажем, у меня были эти свойства в моем классе:

job:Job
job$:Observable<Job>

потом в мой шаблон, я называю это так:

{{job | async }}

вместо:

{{job$ | async }}

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


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

в файле службы добавьте следующее.

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

@Injectable()
export class MoviesService {

  constructor(private db: AngularFireDatabase) {}
  getMovies() {
    this.db.list('/movies').valueChanges();
  }
}

в компоненте добавить следующее.

import { Component, OnInit } from '@angular/core';
import { MoviesService } from './movies.service';

@Component({
  selector: 'app-movies',
  templateUrl: './movies.component.html',
  styleUrls: ['./movies.component.css']
})
export class MoviesComponent implements OnInit {
  movies$;

  constructor(private moviesDb: MoviesService) { 
   this.movies$ = moviesDb.getMovies();
 }

в вашем html-файле добавьте следующее.

<li  *ngFor="let m of movies$ | async">{{ m.name }} </li>

вы должны добавить трубу к interpolation, а не ngFor

ul
  li(*ngFor='let movie of (movies)') ///////////removed here///////////////////
    | {{ movie.title | async }}

справочные документы