首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AngularFire5 - Reference.update失败:第一个参数在属性中包含一个函数

AngularFire5 - Reference.update失败:第一个参数在属性中包含一个函数
EN

Stack Overflow用户
提问于 2017-12-05 09:24:55
回答 1查看 927关注 0票数 1

我正在尝试将更改保存到Firebase DB中的现有节点,但我在这里得到了以下错误:

失败:第一个参数包含属性'matatu-list.-L-RMcqjnladFM5-V80b.payload.node_.children_.comparator_‘中的一个函数,其内容=函数NAME_COMPARATOR(左,右){返回util_1.nameCompare(左,右);}

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

下面是我用来构造DB的接口:

interface.ts

代码语言:javascript
复制
export interface Matatu {
    $key?: string;
    matNumberPlate: string;
    matSacco: string;
    matDriver: string;
    matAccessCode: string;
    matStatus: string;
    matTracker: string;
    matLocation: string;

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

}

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

.ts

代码语言:javascript
复制
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();
  }

}

.html

代码语言:javascript
复制
<ion-content>
  <ion-list>
    <ion-list-header>
      Matatu Details 
    </ion-list-header>

    <ion-item>
        <ion-label>Sacco</ion-label>
        <ion-input type="text" [(ngModel)]="matatu.matSacco"></ion-input>
    </ion-item>

    <ion-item>
        <ion-label>Driver</ion-label>
        <ion-input type="text" [(ngModel)]="matatu.matDriver"></ion-input>
    </ion-item>

    <ion-item>
          <ion-label> Access Code</ion-label>
          <ion-input type="password" [(ngModel)]="matatu.matAccessCode"></ion-input>
    </ion-item>

  </ion-list>
  <ion-list radio-group [(ngModel)]="matatu.matTracker">
    <ion-list-header>
      Preferred Tracking 
    </ion-list-header>

    <ion-item>
        <ion-label>GPS</ion-label>
        <ion-radio checked="true" value="GPS"></ion-radio>
    </ion-item>

    <ion-item>
        <ion-label>Driver's Location</ion-label>
        <ion-radio value="Driver's Location"></ion-radio>
    </ion-item>
  </ion-list>

  <div padding>
    <button ion-button block (click)="editMatatu(matatu)">Save Changes</button>
  </div>
</ion-content>

我该怎么纠正这件事?如果有人告诉我我哪里出了问题,还有其他什么方法可以做到(即使是肮脏的!),我将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-05 13:35:23

您可以在占位符变量中传递密钥,也可以像这样将其连接起来:

代码语言:javascript
复制
this.matatuRef$ = this.database.object(`matatu-list/`+ matKey);

请记住,这不是一个好的方法,但它会成功的。

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

根据您的接口,以及您要从模板传递的值,

更新方法应该如下所示:

代码语言:javascript
复制
editMatatu(matatu : Matatu){

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


  }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47650059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档