2017-07-01 66 views
8

Potrzebuję twojej pomocy, próbuję wyświetlić dane z mojej bazy, ale powoduje to błąd podobny do InvalidPipeArgument: '[object Object]' for pipe 'AsyncPipe'.Angular 4: InvalidPipeArgument: '[Object Object]' dla potoku 'AsyncPipe'


Jest mój serwis:

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

@Injectable() 
export class MoviesService { 

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

Jest mój komponent:

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); 
     }); 
    }); 
} 
} 

I jest MMY mops:

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

Najpierw zrobiłem bez takiego 'ngOnInit() { this.moviesDb.get() subskrybować ((snap) => { this.movies = przystawki;. console.log (this.movies); }); } 'i miałem to' InvalidPipeArgument: '[obiekt obiektu], [obiekt obiektu], [obiekt obiektu], [obiekt obiektu], [obiekt obiektu], [obiekt obiektu], [obiekt obiektu], [obiekt obiektu] , [object Object] 'dla potoku' AsyncPipe'' –

Odpowiedz

4

W swojej MoviesService należy importować FirebaseListObservable aby określić typ zwracany FirebaseListObservable<any[]>

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

następnie get() method shou ld jak to-

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

to get() metoda zwróci FirebaseListObervable z listy filmów

W swojej MoviesComponent powinien wyglądać ten

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

    constructor(private moviesDb: MoviesService) { } 

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

Następnie można łatwo iterację filmów bez rury asynchronicznym ponieważ dane mivies [] nie są typem obserwowalnym, Twój html powinien polubić ten numer: , a Twój html powinien być taki:

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

jeśli declear filmów jako

movies: FirebaseListObservable<any[]>; 

to należy po prostu zadzwonić

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

a html powinno być to

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

Wielkie dzięki! teraz działa –

6

async służy do wiązania Obserables i Obietnic, ale wygląda na to, że wiążemy zwykły obiekt. Możesz po prostu usunąć oba słowa kluczowe async i prawdopodobnie powinno działać.

+0

'this.db.list ('/ movies')' ma prawa obserwowalne? –

+0

Ale wiążesz emitowaną wartość tego Obserwowalnego, a nie samego obserwowalnego w metodzie "subscribe". 'Movies' nie jest typem obserwowalnym, to' any [] 'type. –

+0

Umieszczam "movies: any []; Konstruktor (prywatne filmyDb: MoviesService) {} "Przepraszam, nie rozumiem tego dobrze, więc co mam zrobić? –

0

Należy dodać rurę do interpolation a nie do ngFor

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

Reference docs

+0

jeśli usunę asynchronizację, mam ten błąd: "Nie mogę znaleźć innego obiektu pomocniczego" [obiekt obiektu] "typu" obiekt ". NgFor obsługuje tylko powiązanie z Iterables, takie jak Array. "Zrobiłem to, co zostało wspomniane w dokumencie angularfire2: https://github.com/angular/angularfire2 –

+0

sprawdź dane z usługi przez' console.log' jeśli jest to tablica obiektów lub nie – Aravind

1

pojawi się ten komunikat, kiedy już używany asynchronizuj w swoim szablonie, ale odnoszą się do obiektu, który nie jest obserwowalny.

Więc dla przykładów sake, pozwala powiedzieć, że miał te właściwości w mojej klasie:

job:Job 
job$:Observable<Job> 

Wtedy w moim szablonu, odnoszę się do niego w ten sposób:

{{job | async }} 

zamiast:

{{job$ | async }} 

Nie potrzebujesz pracy: Właściwość zadania, jeśli używasz rury asynchronicznej, ale służy ona do zilustrowania przyczyny t on błąd.

+1

Ta odpowiedź jest lepsza niż akceptowana, ponieważ wyraźnie wyjaśnia problem z ogólnego punktu widzenia. –