53 votes

Angular 4 : InvalidPipeArgument : '[object Object]' pour le tube 'AsyncPipe'.

J'ai besoin de votre aide, j'essaie d'afficher des données à partir de ma base de données mais j'obtiens une erreur du type suivante InvalidPipeArgument: '[object Object]' for pipe 'AsyncPipe' .


Il y a mon service :

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

@Injectable()
export class MoviesService {

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

Voilà mon composant :

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

Et il y a mon carlin :

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

0 votes

J'ai d'abord fait sans comme ça ngOnInit() { this.moviesDb.get().subscribe((snap) => { this.movies = snap; console.log(this.movies); }); } et j'avais ça InvalidPipeArgument: '[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]' for pipe 'AsyncPipe'

44voto

Adnan A. Points 1212

async est utilisé pour se lier aux Observables et aux Promesses, mais il semble que vous vous liez à un objet ordinaire. Vous pouvez simplement supprimer les deux async mots-clés et cela devrait probablement fonctionner.

1 votes

Mais vous vous liez à la valeur émise de cet Observable, et non pas à l'Observable lui-même dans la balise subscribe méthode. Movies n'est pas un type Observable, c'est un type any[] type.

0 votes

J'ai mis movies: any[]; constructor(private moviesDb: MoviesService) { } Désolé, je ne comprends pas bien, alors que dois-je faire ?

2 votes

Il suffit de retirer le async . Tous les deux.

20voto

JGFMK Points 405

Vous obtenez ce message lorsque vous avez utilisé async dans votre modèle, mais que vous faites référence à un objet qui n'est pas un Observable.

Donc, à titre d'exemple, disons que j'ai ces propriétés dans ma classe :

job:Job
job$:Observable<Job>

Ensuite, dans mon modèle, j'y fais référence de cette façon :

{{job | async }}

au lieu de :

{{job$ | async }}

Vous n'aurez pas besoin de la propriété job:Job si vous utilisez le tuyau asynchrone, mais elle sert à illustrer une cause de l'erreur.

6 votes

J'aime mieux cette réponse que celle qui a été acceptée, car elle explique clairement la question d'un point de vue générique.

18voto

Nizam Uddin Points 236

Dans votre MoviesService, vous devez importer FirebaseListObservable afin de définir le type de retour. FirebaseListObservable<any[]>

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

alors la méthode get() devrait ressembler à ceci-

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

cette méthode get() retournera FirebaseListObervable de la liste des films.

Dans votre MoviesComponent devrait ressembler à ceci

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

  constructor(private moviesDb: MoviesService) { }

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

Ensuite, vous pouvez facilement itérer à travers les films sans pipe asynchrone comme les données movies[] ne sont pas de type observable, votre html devrait être ceci

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

si vous décélérez les films comme un

movies: FirebaseListObservable<any[]>;

alors vous devez simplement appeler

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

et votre html devrait être le suivant

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

0 votes

Notez que dans la dernière version de la base Angular Fire, "FirebaseListObservable" a été déprécié. Comme alternative, vous pouvez utiliser "AngularFireList" à la place, mais notez que c'est facultatif, voire redondant. import { AngularFireDatabase , AngularFireList} from '@angular/fire/database'; De plus, dans la dernière version d'Angular fire, au lieu d'utiliser subscribe dans le constructeur du composant, on utilise valueChanges() . Voir plus github.com/angular/angularfire/blob/

8voto

Sanjeet kumar Points 1936

J'ai trouvé une autre solution pour obtenir les données. selon la documentation Veuillez consulter la documentation lien

Dans le fichier de service, ajoutez ce qui suit.

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

@Injectable()
export class MoviesService {

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

Dans Composant, ajoutez ce qui suit.

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

Dans votre fichier html, ajoutez ce qui suit.

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

0 votes

C'est la bonne réponse pour tous ceux qui recherchent le nouveau module AngularFireDatabase qui est importé comme ceci : "import { AngularFireDatabase } from '@angular/fire/database' ;"

0 votes

Merci ! C'est la bonne réponse pour ma version-- angularfire2@5.1.1

0voto

Aravind Points 21523

Vous devez ajouter le tuyau au interpolation et non à la ngFor

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

Documents de référence

0 votes

Si je supprime l'asynchronisme, j'obtiens cette erreur : Cannot find a differ supporting object '[object Object]' of type 'object'. NgFor only supports binding to Iterables such as Arrays. J'ai fait comme il était mentionné dans la doc d'angularfire2 : github.com/angular/angularfire2

0 votes

Vérifier les données de service par console.log si c'est un tableau d'objets ou non

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X