Firebase AngularFire5—;Reference.update失败:第一个参数在属性中包含函数

Firebase AngularFire5—;Reference.update失败:第一个参数在属性中包含函数,firebase,firebase-realtime-database,ionic3,angularfire5,Firebase,Firebase Realtime Database,Ionic3,Angularfire5,我正试图保存对Firebase DB中现有节点的更改,但在此处出现以下错误: Reference.update失败:第一个参数在属性“matatu list.-L-RMcqjnladFM5-V80b.payload.node\子对象\比较器\中包含函数,其内容=函数名\比较器(左、右){ 返回util_1.nameCompare(左、右); } 我想根据项目各自的键(从另一页通过navParams传递)编辑项目 下面是我用来构造数据库的接口: interface.ts export inter

我正试图保存对Firebase DB中现有节点的更改,但在此处出现以下错误:

Reference.update失败:第一个参数在属性“matatu list.-L-RMcqjnladFM5-V80b.payload.node\子对象\比较器\中包含函数,其内容=函数名\比较器(左、右){ 返回util_1.nameCompare(左、右); }

我想根据项目各自的键(从另一页通过
navParams
传递)编辑项目

下面是我用来构造数据库的接口:

interface.ts

export interface Matatu {
    $key?: string;
    matNumberPlate: string;
    matSacco: string;
    matDriver: string;
    matAccessCode: string;
    matStatus: string;
    matTracker: string;
    matLocation: string;

    //Optionals
    payload?:any;
    key?:any;

}
import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams } from 'ionic-angular';
import { AngularFireObject, AngularFireDatabase } from 'angularfire2/database';
import { Matatu } from '../../models/matatu/matatu.interface';
import { Subscription } from 'rxjs/Subscription';


@IonicPage()
@Component({
  selector: 'page-edit-ma3',
  templateUrl: 'edit-ma3.html',
})
export class EditMa3Page {

  matatuRef$: AngularFireObject<Matatu>;
  matatuAsync$: any;
  matatu = {} as Matatu;
  sub: Subscription;

  constructor(public navCtrl: NavController, public navParams: NavParams, private database: AngularFireDatabase) {

    const matKey = this.navParams.get('matKey');
    this.matatuRef$ = this.database.object(`matatu-list/${matKey}`);
    this.matatuAsync$ = this.matatuRef$.snapshotChanges();
    //console.log(matKey);

    this.sub = this.matatuAsync$.subscribe(
      matatu => this.matatu = matatu
    )
  }

  editMatatu(matatu : Matatu){
    this.matatuRef$.update(matatu);

    this.navCtrl.pop();
  }

  ionViewWillLeave(){
    this.sub.unsubscribe();
  }

}
用于更新记录的
.ts
.html
代码:

.ts

export interface Matatu {
    $key?: string;
    matNumberPlate: string;
    matSacco: string;
    matDriver: string;
    matAccessCode: string;
    matStatus: string;
    matTracker: string;
    matLocation: string;

    //Optionals
    payload?:any;
    key?:any;

}
import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams } from 'ionic-angular';
import { AngularFireObject, AngularFireDatabase } from 'angularfire2/database';
import { Matatu } from '../../models/matatu/matatu.interface';
import { Subscription } from 'rxjs/Subscription';


@IonicPage()
@Component({
  selector: 'page-edit-ma3',
  templateUrl: 'edit-ma3.html',
})
export class EditMa3Page {

  matatuRef$: AngularFireObject<Matatu>;
  matatuAsync$: any;
  matatu = {} as Matatu;
  sub: Subscription;

  constructor(public navCtrl: NavController, public navParams: NavParams, private database: AngularFireDatabase) {

    const matKey = this.navParams.get('matKey');
    this.matatuRef$ = this.database.object(`matatu-list/${matKey}`);
    this.matatuAsync$ = this.matatuRef$.snapshotChanges();
    //console.log(matKey);

    this.sub = this.matatuAsync$.subscribe(
      matatu => this.matatu = matatu
    )
  }

  editMatatu(matatu : Matatu){
    this.matatuRef$.update(matatu);

    this.navCtrl.pop();
  }

  ionViewWillLeave(){
    this.sub.unsubscribe();
  }

}
我该如何着手纠正这一点?如果有人告诉我哪里出了错,还有什么其他方法可以做到这一点(即使是肮脏的方法!),我将不胜感激。

您可以在占位符变量中传递键,也可以像这样连接它:

this.matatuRef$ = this.database.object(`matatu-list/`+ matKey);
请记住,这不是一个好方法,但它会起作用

当您尝试推送包含函数或数据类型而不是数据值的数据时,Firebase会触发此错误

根据您的界面和您从模板传递的值,您的
更新方法应如下所示:

editMatatu(matatu : Matatu){

    this.matatuRef$.update({
      matDriver: this.matatu.matDriver,
      matAccessCode: this.matatu.matAccessCode,
      matSacco: this.matatu.matSacco
    });


  }

这个问题又出现了。我已经修改了我的答案。