2017-12-29 43 views
0

firebaseのリアルタイムデータベースオブジェクトのtituloフィールドを更新しようとすると、別のフィールドが生成されるのはなぜですか?更新する正しい方法は何ですか?私は文書を見ていた:https://github.com/angular/angularfire2/blob/master/docs/rtdb/objects.mdと私は彼らがそこに表示されている例を動作させるが、それはリストです。この場合、私は別のページのオブジェクトで作業しています。何か案は?update()オブジェクトRTDB Firebase

enter image description here

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 }); 
 
    } 
 

 
}

+0

実際には、タイムスタンプであるルートノードの子ノードを更新しています。まず、子ノードが保存されている子ノードの自動生成IDを取得する必要があります。そのキーを使用して、更新する子への参照を取得します。子ノードはメインルート参照ノードではなくタイムスタンプIDの下に保存されるためです。 – Himanshu

答えて

0

更新機能であなたのパスが正しくありません。

それはthis.proyectosRef.child(key).update({ titulo: newTitulo });

私はキーを編集するためのUIDであると信じていなければなりません。

+0

私は試しましたが、 'AngularFireObject '型に 'child'が存在しないことを教えてくれます。可能であれば、Stackblitzを見てください:https://stackblitz.com/edit/angular-sftzts?embed=1&file=app/portafolio-detalles/portafolio-detalles.component.html –

+0

あなたは正しいキーを取得していません。 valueChangesの代わりにsnapshotChangesを使用します – Hareesh

0

まず、更新したい子のfirebase子タイムスタンプIDを、更新したい値キーと比較することで取得します。そして、その特定の子ノードを参照するために、その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

+0

次のエラーが表示されます: 'property 'orderByChild'が型AngularFireObject 'に存在しません。可能であれば、Stackblitzを見てみましょう:https://stackblitz.com/edit/angular-sftzts?embed=1&file=app/portafolio-detalles/portafolio-detalles.component.html –

+0

子ノードのキーの名前で子ノード。次に、自動生成されたタイムスタンプへの参照を取得できます。私はノードjsを持つfirebaseを与えました。それは、firebaseの文書に記載されています。私はちょうどその中のリンクをチェックして答えを編集しました。 – Himanshu

関連する問題