我需要你的帮助,我试图在我的火力显示屏上显示一些数据,但它却给我一个像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 }}
答案 0 :(得分:20)
DŽ
用于绑定到Observables和Promises,但似乎你绑定到常规对象。您可以删除这两个async
个关键字,它应该可以正常工作。
答案 1 :(得分:15)
在您的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 }}
如果您将电影视为</ p>
movies: FirebaseListObservable<any[]>;
然后你应该简单地打电话
movies: FirebaseListObservable<any[]>;
ngOnInit() {
this.movies = this.moviesDb.get();
}
你的html应该是这个
ul
li(*ngFor='let movie of movies | async')
{{ movie.title }}
答案 2 :(得分:10)
当您在模板中使用async时,会收到此消息,但是指的是一个不是Observable的对象。
因此,举例来说,让我们来看看。说我在班上有这些属性:
job:Job
job$:Observable<Job>
然后在我的模板中,我这样说:
{{job | async }}
而不是:
{{job$ | async }}
如果您使用异步管道,您将不需要该作业:作业属性,但它用于说明错误的原因。
答案 3 :(得分:3)
我找到了另一种获取数据的解决方案。根据文档请检查文档 link
在服务文件中添加以下内容。
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>
答案 4 :(得分:0)
您应该将管道添加到interpolation
而不是ngFor
ul
li(*ngFor='let movie of (movies)') ///////////removed here///////////////////
| {{ movie.title | async }}
<强> Reference docs 强>