Angular 4: InvalidPipeArgument: '[object Object]' for pipe 'AsyncPipe'
Angular 4: InvalidPipeArgument: '[object Object]' for pipe 'AsyncPipe'
我需要你的帮助,我正在尝试显示我的 firebase 中的一些数据,但它给我一个错误,如 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 }}
async
用于绑定到 Observables 和 Promises,但看起来您正在绑定到常规对象。您可以只删除两个 async
关键字,它应该可以工作。
您应该将管道添加到 interpolation
而不是 ngFor
ul
li(*ngFor='let movie of (movies)') ///////////removed here///////////////////
| {{ movie.title | async }}
在您的 MoviesService 中,您应该导入 FirebaseListObservable 以定义 return 类型 FirebaseListObservable<any[]>
import { AngularFireDatabase, FirebaseListObservable } from 'angularfire2/database';
那么 get() 方法应该是这样的-
get (): FirebaseListObservable<any[]>{
return this.db.list('/movies');
}
此 get() 方法将 return 电影列表的 FirebaseListObervable
在您的 MoviesComponent 中应该如下所示
export class MoviesComponent implements OnInit {
movies: any[];
constructor(private moviesDb: MoviesService) { }
ngOnInit() {
this.moviesDb.get().subscribe((snaps) => {
this.movies = snaps;
});
}
}
然后你可以轻松地遍历电影而无需异步管道,因为电影[]数据不是可观察类型,你的html应该是这个
ul
li(*ngFor='let movie of movies')
{{ movie.title }}
如果您将电影声明为
movies: FirebaseListObservable<any[]>;
那么你应该直接调用
movies: FirebaseListObservable<any[]>;
ngOnInit() {
this.movies = this.moviesDb.get();
}
你的html应该是这个
ul
li(*ngFor='let movie of movies | async')
{{ movie.title }}
当您在模板中使用了 async,但引用的对象不是 Observable 时,您会收到此消息。
为了举例,假设我的 class:
中有这些属性
job:Job
job$:Observable<Job>
然后在我的模板中,我这样引用它:
{{job | async }}
而不是:
{{job$ | async }}
如果您使用异步管道,则不需要 job:Job 属性,但它可以说明错误原因。
我找到了另一种获取数据的解决方案。根据文档请检查文档 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>
好的,我遇到了类似的问题,现在我已经解决了,所以让我解释一下您可以做什么,但首先我不知道您使用的 angular 是哪个版本,所以我添加的方法可能会有所不同我的设置版本如下
Angular CLI: 13.3.1
Node: 16.14.2
Package Manager: npm 8.5.0
OS: win32 x64
Angular: 13.3.1
... animations, cli, common, compiler, compiler-cli, core, forms
... platform-browser, platform-browser-dynamic, router
Package Version
@angular-devkit/architect 0.1303.1
@angular-devkit/build-angular 13.3.1
@angular-devkit/core 13.3.1
@angular-devkit/schematics 13.3.1
@angular/fire 7.3.0
@schematics/angular 13.3.1
rxjs 7.5.5
typescript 4.6.3
1 首先更改的是您的服务文件,将其更改为
<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false">
<div class="snippet-code">
<pre><code>import { Injectable } from '@angular/core';
import { AngularFireDatabase } from 'angularfire2/database';
@Injectable()
export class MoviesService {
constructor(private db: AngularFireDatabase) {}
get = () => this.db.list('/movies');
}
我需要你的帮助,我正在尝试显示我的 firebase 中的一些数据,但它给我一个错误,如 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 }}
async
用于绑定到 Observables 和 Promises,但看起来您正在绑定到常规对象。您可以只删除两个 async
关键字,它应该可以工作。
您应该将管道添加到 interpolation
而不是 ngFor
ul
li(*ngFor='let movie of (movies)') ///////////removed here///////////////////
| {{ movie.title | async }}
在您的 MoviesService 中,您应该导入 FirebaseListObservable 以定义 return 类型 FirebaseListObservable<any[]>
import { AngularFireDatabase, FirebaseListObservable } from 'angularfire2/database';
那么 get() 方法应该是这样的-
get (): FirebaseListObservable<any[]>{
return this.db.list('/movies');
}
此 get() 方法将 return 电影列表的 FirebaseListObervable
在您的 MoviesComponent 中应该如下所示
export class MoviesComponent implements OnInit {
movies: any[];
constructor(private moviesDb: MoviesService) { }
ngOnInit() {
this.moviesDb.get().subscribe((snaps) => {
this.movies = snaps;
});
}
}
然后你可以轻松地遍历电影而无需异步管道,因为电影[]数据不是可观察类型,你的html应该是这个
ul
li(*ngFor='let movie of movies')
{{ movie.title }}
如果您将电影声明为
movies: FirebaseListObservable<any[]>;
那么你应该直接调用
movies: FirebaseListObservable<any[]>;
ngOnInit() {
this.movies = this.moviesDb.get();
}
你的html应该是这个
ul
li(*ngFor='let movie of movies | async')
{{ movie.title }}
当您在模板中使用了 async,但引用的对象不是 Observable 时,您会收到此消息。
为了举例,假设我的 class:
中有这些属性job:Job
job$:Observable<Job>
然后在我的模板中,我这样引用它:
{{job | async }}
而不是:
{{job$ | async }}
如果您使用异步管道,则不需要 job:Job 属性,但它可以说明错误原因。
我找到了另一种获取数据的解决方案。根据文档请检查文档 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>
好的,我遇到了类似的问题,现在我已经解决了,所以让我解释一下您可以做什么,但首先我不知道您使用的 angular 是哪个版本,所以我添加的方法可能会有所不同我的设置版本如下
Angular CLI: 13.3.1
Node: 16.14.2
Package Manager: npm 8.5.0
OS: win32 x64
Angular: 13.3.1
... animations, cli, common, compiler, compiler-cli, core, forms
... platform-browser, platform-browser-dynamic, router
Package Version
@angular-devkit/architect 0.1303.1
@angular-devkit/build-angular 13.3.1
@angular-devkit/core 13.3.1
@angular-devkit/schematics 13.3.1
@angular/fire 7.3.0
@schematics/angular 13.3.1
rxjs 7.5.5
typescript 4.6.3
1 首先更改的是您的服务文件,将其更改为
<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false">
<div class="snippet-code">
<pre><code>import { Injectable } from '@angular/core';
import { AngularFireDatabase } from 'angularfire2/database';
@Injectable()
export class MoviesService {
constructor(private db: AngularFireDatabase) {}
get = () => this.db.list('/movies');
}