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

Reference docs

在您的 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');
    }

对此,

<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(): Observable<any[]>{
          return this.db.list('/movies')
      } 
    }

注意:- 不要忘记从适当的模块导入 Observable

然后从这个改变你的组件

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false">
<div class="snippet-code">
<pre><code>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);
          });
       });
     }
    }

像这样

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false">
<div class="snippet-code">
<pre><code>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.movies$ = this.moviesDb.get()
        .subscribe((snaps) => {
          snaps.forEach((snap) => {
            this.movies$ = snap;
            console.log(this.movies$);
          });
       });
     }
    }

还有你的最后一个文件

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false">
<div class="snippet-code">
<pre><code>ul
   li(*ngFor='let movie of (movies | async)')
      | {{ movie.title | async }}

对此

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

我不是专业人士,但我是这样解决的,希望它对你也有用