2017-10-06 1 views
6

Je n'arrive pas à obtenir une application de base de liste de tâches CRUD en utilisant Ionic 3 et Firebase pour fonctionner.Ionic et Firebase - InvalidPipeArgument: '[object Object]' pour le tuyau 'AsyncPipe'

Le message d'erreur que je suis coincé sur est:

Uncaught (en promesse): Erreur: InvalidPipeArgument: '[objet Object]' pour pipe 'AsyncPipe'

Le message d'erreur a commencé quand je ajouté la section <ion-item *ngFor="let item of shoppingListRef$ | async"> au-list.html:

shopping-list.html

<ion-header> 
    <ion-navbar color="primary"> 
    <ion-title>Shopping List</ion-title> 
    <ion-buttons end> 
     <button ion-button icon-only (click)="navigateToAddShoppingPage()"> 
     <ion-icon name="add"></ion-icon> 
     </button> 
    </ion-buttons> 
    </ion-navbar> 
</ion-header> 
<ion-content padding> 
    <ion-list> 
    <ion-item *ngFor="let item of shoppingListRef$ | async"> 
     <h2>Item Name: {{item.itemName}}</h2> 
     <h3>Amount: {{item.itemNumber}}</h3> 
    </ion-item> 
    </ion-list> 
</ion-content> 

J'ai essayé de commenter le code entre <ion-item> et </ion-item> dans le fichier ci-dessus, et cela supprime le message d'erreur. Cependant, ne peut pas comprendre comment résoudre ce problème.

Voici quelques fichiers pertinents impliqués.

shopping-list.ts

import { Component } from '@angular/core'; 
import { IonicPage, NavController, NavParams } from 'ionic-angular'; 

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

import { AddShoppingPage } from '../add-shopping/add-shopping'; 
import { ShoppingItem } from '../../models/shopping-item/shopping-item.interface'; 

@Component({ 
    selector: 'page-shopping-list', 
    templateUrl: 'shopping-list.html', 
}) 
export class ShoppingListPage { 

    shoppingListRef$: FirebaseListObservable<ShoppingItem[]> 

    constructor(public navCtrl: NavController, public navParams: NavParams, private database: AngularFireDatabase) { 
    this.shoppingListRef$ = this.database.list('shopping-list'); 
    } 

    navigateToAddShoppingPage() { 
    this.navCtrl.push(AddShoppingPage) 
    } 
} 

shopping-item.interface.ts

export interface ShoppingItem { 
    itemName: string; 
    itemNumber: number; 
} 

Merci à l'avance pour toutes les idées/aide que vous pourriez avoir!

+0

quelle version de angularfire vous utilisez? –

+0

J'utilise angularfire2 - vous pouvez voir dans shopping-list.ts dans 'import {AngularFireDatabase, FirebaseListObservable} à partir de 'angularfire2/database';' @HamedBaatour – Adam

Répondre

5

Je pense que vous utilisez la nouvelle version angularfire2 qui est la version 5 dans ce cas, vous devez faire ce qui suit:

import { Component } from '@angular/core'; 
import { AngularFireDatabase } from 'angularfire2/database'; 
import { Observable } from 'rxjs/Observable'; 

@Component({ 
    selector: 'page-shopping-list', 
    templateUrl: 'shopping-list.html', 
}) 
export class ShoppingListPage { 
shoppingListRef$: Observable<any[]>; 
    constructor(database: AngularFireDatabase) { 
    this.shoppingListRef$ = this.database.list('shopping-list').valueChanges();; 
    } 
} 

comme à partir de la version 5 database.list ne renvoie plus observable que vous ne peut pas s'y abonner dans le modèle en utilisant le tube async. C'est pourquoi vous devriez enchaîner la méthode valueChanges() qui renvoie un Observable dans ce cas.

+1

Cela a fonctionné, mais plutôt que de faire tous les changements indiqués ci-dessus, j'ai simplement fait un changement pour enchaîner la méthode 'valueChanges(); Merci! – Adam

+0

@Adam génial! heureux que cela vous a aidé. Je vous ai demandé au début de votre version de 'angularfire2' mais je devais deviner pour vous aider;) –

+0

Oui, j'ai vu ça - je n'avais pas réalisé que angularfire2 avait une version différente mais maintenant je sais pour la prochaine fois. Merci! – Adam

0
<ion-list *ngIf="shoppingListRef$ | async; let shoppingListRef"> 
    <ion-item *ngFor="let item of shoppingListRef"> 
     <h2>Item Name: {{item.itemName}}</h2> 
     <h3>Amount: {{item.itemNumber}}</h3> 
    </ion-item> 
    </ion-list>