update()对象RTDB Firebase

时间:2017-12-29 05:39:43

标签: angular firebase firebase-realtime-database

为什么当我尝试更新firebase中的实时数据库对象的titulo字段时,是否会生成另一个字段?更新的正确方法是什么?我正在查看文档:{​​{3}},如果我使用他们在那里显示的示例,但是有一个列表。在这种情况下,我正在使用不同页面上的对象。有什么想法吗?

https://github.com/angular/angularfire2/blob/master/docs/rtdb/objects.md

editar.component.html

<input type="text" #newtitulo [value]="titulo"/>
<button (click)="updateProyecto(key, newtitulo.value)">Update</button>

editar.component.ts

import { Component, OnInit } from '@angular/core';
import { AngularFireDatabase, AngularFireList, AngularFireObject } from 'angularfire2/database';
import { FirebaseService } from '../../../servicios/firebase.service';
import { ActivatedRoute } from '@angular/router';
import { Observable } from "rxjs/Observable";
import 'rxjs/add/operator/map';


@Component({
  selector: 'app-editar-proyecto',
  templateUrl: './editar-proyecto.component.html',
  styleUrls: ['./editar-proyecto.component.scss']
})
export class EditarProyectoComponent implements OnInit {


  proyectosRef: AngularFireObject<any>;
  proyecto: Observable<any[]>;
  id;
  titulo;
  destacado;
  descripcion;


  constructor(private fs: FirebaseService, private activateRoute: ActivatedRoute, private db: AngularFireDatabase) {
    this.proyectosRef = db.object('/proyectos');
    this.proyecto = this.proyectosRef.valueChanges();
  }

  ngOnInit() {
    this.id = this.activateRoute.snapshot.params['id'];
    this.fs.getProyectoDetalles(this.id).valueChanges().forEach(proyecto => {
      this.titulo = proyecto.titulo;
      this.destacado = proyecto.destacado;
      this.descripcion = proyecto.descripcion;
    });
  }

  updateProyecto(key: string, newTitulo: string) {
    this.proyectosRef.update({ titulo: newTitulo });
  }

}

2 个答案:

答案 0 :(得分:0)

更新功能中的路径不正确。

应为this.proyectosRef.child(key).update({ titulo: newTitulo });

我相信密钥是编辑的uid。

答案 1 :(得分:0)

首先通过将要与更新的值键进行比较,获取要更新的子项的firebase子时间戳ID。然后在child中使用该id来引用该特定的子节点。

this.proyectosRef.orderByChild(proyecto.titulo).once("value", function(snapshot) {
  this.proyectosRef.child(snapshot.key).update({  titulo: newTitulo }, () =>{
                          console.log("record updated")
                        })
});

您必须使用orderByChild函数通过子节点的名称找到要更新的特定节点的时间戳自动生成密钥。请考虑以下链接以获得更多想法https://www.firebase.com/docs/web/api/query/orderbychild.html