2017-07-01 47 views
8

我需要你的帮助,我试图从我的firebase显示一些数据,但它会显示一个错误,如InvalidPipeArgument: '[object Object]' for pipe 'AsyncPipe'Angular 4:InvalidPipeArgument:'[object Object]'管道'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); 
     }); 
    }); 
} 
} 

而且有MMY哈巴狗:

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

首先我没有没有这样'ngOnInit(){ this.movi​​esDb.get()订阅((SNAP)=> { this.movi​​es =管理单元; 的console.log(this.movi​​es); } );我有'InvalidPipeArgument:'[object object],[object object],[object object],[object object],[object object],[object object],[object object],[object Object] ,'object object]'管'AsyncPipe'' –

回答

4

在你MoviesService你应该导入FirebaseListObservable以确定返回类型FirebaseListObservable<any[]>

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

then get()method shou像这个 -

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

这个GET LD()方法将返回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 }} 
+0

非常感谢!现在它的工作 –

6

async用于绑定到Observables和Promises,但它看起来像你绑定到一个普通的对象。您可以删除两个async关键字,它应该可能工作。

+0

'this.db.list('/ movies')'是一个可观察的权利? –

+0

但是您绑定的是Observable的发射值,而不是'subscribe'方法中的observable本身。 “电影”不是可观察类型,它是任何[]类型。 –

+0

我把'电影:任何[]; 构造函数(私人moviesDb:MoviesService){}'对不起,我不明白,所以我该怎么办? –

0

你应该管添加到interpolation,而不是到ngFor

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

Reference docs

+0

如果我删除异步我有这个错误:'无法找到类型'对象'不同的支持对象'[对象对象]'。 NgFor只支持绑定到Array之类的Iterables.'我按照在angularfire2的文档中提到的那样做了:https://github.com/angular/angularfire2 –

+0

如果是'console.log',检查服务中的数据,对象数组 – Aravind

1

你得到这个消息时所使用在模板中是异步的,但是指的是不是可观察的对象。

所以对实例的缘故,让说我在我的班级这些属性:

job:Job 
job$:Observable<Job> 

然后在我的模板,我指的是这样:

{{job | async }} 

代替:

{{job$ | async }} 

如果您使用异步管道,您将不需要该作业:Job属性,但它用来说明导致t他错了。

+1

我喜欢这个答案比接受的更好,因为它从一个通用的角度清楚地解释了这个问题。 –