【问题标题】:InvalidPipeArgument:'[object Object]' for pipe'Asyncpipe'InvalidPipeArgument:'[object Object]' for pipe'Asyncpipe'
【发布时间】:2018-10-12 18:07:24
【问题描述】:

我知道有人问过这个完全相同的问题: InvalidPipeArgument: '[object Object]' for pipe 'AsyncPipe' / angularfire2 [duplicate] 但是按照这个建议并不能解决我的问题。

我正在尝试从 Firebase 数据库中获取一个列表并将其显示在 ionic 中。

我已经能够从数据库中获取数据(console.log),但是,我无法在应用程序中显示它。 (也许问题更多出在 *ngFor 或 HTML 部分)

这是我项目中的 package.json:

{
  "name": "brianAppResto",
  "version": "0.0.1",
  "author": "Ionic Framework",
  "homepage": "http://ionicframework.com/",
  "private": true,
  "scripts": {
    "start": "ionic-app-scripts serve",
    "clean": "ionic-app-scripts clean",
    "build": "ionic-app-scripts build",
    "lint": "ionic-app-scripts lint"
  },
  "dependencies": {
    "@angular/animations": "^5.1.3",
    "@angular/common": "^5.1.3",
    "@angular/compiler": "^5.1.3",
    "@angular/compiler-cli": "^5.1.3",
    "@angular/core": "^5.1.3",
    "@angular/fire": "^5.0.2",
    "@angular/forms": "^5.1.3",
    "@angular/http": "^5.1.3",
    "@angular/platform-browser": "^5.1.3",
    "@angular/platform-browser-dynamic": "^5.1.3",
    "@angular/platform-server": "^5.1.3",
    "@angular/router": "^5.1.3",
    "@ionic-native/core": "~4.15.0",
    "@ionic-native/splash-screen": "~4.15.0",
    "@ionic-native/status-bar": "~4.15.0",
    "@ionic/pro": "2.0.3",
    "@ionic/storage": "2.2.0",
    "firebase": "^5.5.3",
    "ionic-angular": "3.9.2",
    "ionicons": "3.0.0",
    "promise-polyfill": "^8.1.0",
    "rxjs": "^6.3.3",
    "rxjs-compat": "^6.3.3",
    "sw-toolbox": "3.6.0",
    "zone.js": "0.8.26"
  },
  "devDependencies": {
    "@ionic/app-scripts": "3.2.0",
    "typescript": "~2.6.2"
  },
  "description": "An Ionic project"
}

这是我的menu.ts

import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams, ToastController } from 'ionic-angular';
import { AddMenuPage } from '../add-menu/add-menu';
import { AngularFireAuth } from '@angular/fire/auth';
import { AngularFireDatabase, AngularFireList } from '@angular/fire/database';
import { Menu } from './../../models/menu';

/**
 * Generated class for the MenuPage page.
 *
 * See https://ionicframework.com/docs/components/#navigation for more info on
 * Ionic pages and navigation.
 */

@IonicPage()
@Component({
  selector: 'page-menu',
  templateUrl: 'menu.html',
})
export class MenuPage {

  menuData: AngularFireList<Menu[]>;

  constructor(private afAuth: AngularFireAuth, private afDatabase: AngularFireDatabase,
    private toast: ToastController,
    public navCtrl: NavController, public navParams: NavParams) {
  }

  ionViewDidLoad() {
    this.afAuth.authState.subscribe(data => {
      if(data && data.email && data.uid){
        this.toast.create({
          message: `Menu berhasil ditambahkan, ${data.email}`,
          duration: 3000
        }).present();

        this.menuData = this.afDatabase.list<Menu>(`menu/${data.uid}`).valueChanges().subscribe(console.log);

      }
      else {
        this.toast.create({
          message: `Could not find authentication details`,
          duration: 3000
        }).present();
      }
    });
  }

  addMenu() {
    this.navCtrl.push('AddMenuPage');
  }
}

这是我的 menu.html

<ion-header>

  <ion-navbar>
    <button ion-button menuToggle>
      <ion-icon name="menu"></ion-icon>
    </button>
    <ion-title>Menu</ion-title>
  </ion-navbar>

</ion-header>


<ion-content padding>
  <button ion-button (click)="addMenu()">Tambah Menu</button>

  <ion-list>
    <ion-item *ngFor="let data of menuData | async">
      <h2>Nama Menu: {{data.menuName}}</h2>
      <h3>Harga: {{data.menuPrice}}</h3>
    </ion-item>
  </ion-list>

</ion-content>

如果这个问题有明显的答案,我对 ionic/angular 还是很抱歉。

非常感谢您的帮助。

【问题讨论】:

  • 当你传递的值是一个承诺或一个可观察的值时,异步管道工作。 menuData 属于 AngularFireList 类型。如果 menuData 是可以使用 AngularFireList. 解析的 Promise 或 Observable 序列,则异步管道将起作用
  • 我已将menuData: AngularFireList&lt;Menu[]&gt;; 更改为menuData$: AngularFireList&lt;Menu[]&gt;;。我还将所有menuData 更改为menuData$。错误消息仍然完全相同。感谢您的回复。

标签: angular firebase ionic-framework


【解决方案1】:

由于您存储了array,因此您不需要使用异步。当您尝试通过Observable 获取值时使用async

  <ion-list>
    <ion-item *ngFor="let data of menuData"> <!-- async is removed -->
      <h2>Nama Menu: {{data.menuName}}</h2>
      <h3>Harga: {{data.menuPrice}}</h3>
    </ion-item>
  </ion-list>

如果要保持异步,请更改以下行

this.menuData = this.afDatabase.list<Menu>(`menu/${data.uid}`).valueChanges().subscribe(console.log);

this.menuData = this.afDatabase.list<Menu>(`menu/${data.uid}`).valueChanges();

【讨论】:

  • 我删除了async。这就是我得到的:Cannot find a differ supporting object '[object Object]' of type 'object'. NgFor only supports bunding to Iterables such as Arrays. 这与 angular/angularfire 的版本/依赖关系有关吗?
  • 因为您没有分配正确的值。您只是在打印控制台。无论如何,我已经更新了我的答案。只需保留async 并更改我在答案中提到的行。
  • 我删除了.valueChanges().subscribe(console.log),但仍然收到错误Cannot find a differ supporting object ...。还有其他可能的原因吗?
  • 试试this.menuData = this.afDatabase.list&lt;Menu&gt;(menu/${data.uid}).valueChanges()
  • 你是男人!非常感谢!它解决了问题!:) :) :) 我已经更新了你的帖子。
【解决方案2】:

您需要在使用 JSON.parse() 或使用 | 接收数据后对其进行解析。 json

在你的情况下,它可能是这样的:-

this.menuData = JSON.parse(this.afDatabase.list<Menu>(`menu/${data.uid}`).valueChanges());

(或)

在html中

<ion-item *ngFor="let data of menuData | async">
      <h2> {{data | json }}</h2>
</ion-item>

【讨论】:

  • 两者仍然产生相同的错误消息:InvalidPipeArgument:'[object Object]' for pipe'Asyncpipe'
  • 你需要移除异步管道
猜你喜欢
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
  • 2018-05-11
  • 1970-01-01
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多