2016-06-17 14 views
5

Angular2 öğesini kullanarak Angular2 projesinde bir öğeyi FirebaseListObservable nesnesinde güncelleştirmeye çalışıyorum. aşağıdaki gibi FirebaseListObservable için tanımı şöyledir:AngularFire 2 kullanarak bir FirebaseListObservable öğesindeki bir öğenin güncellenmesi

export declare type FirebaseOperation = string | firebase.database.Reference | firebase.database.DataSnapshot | AFUnwrappedDataSnapshot; 
export declare class FirebaseListObservable<T> extends Observable<T> { 
    _ref: firebase.database.Reference | firebase.database.Query; 
    constructor(_ref: firebase.database.Reference | firebase.database.Query, subscribe?: <R>(subscriber: Subscriber<R>) => Subscription | Function | void); 
    lift<T, R>(operator: Operator<T, R>): Observable<R>; 
    push(val: any): firebase.database.ThenableReference; 
    update(item: FirebaseOperation, value: Object): firebase.Promise<void>; 
    remove(item?: FirebaseOperation): firebase.Promise<void>; 
    _checkOperationCases(item: FirebaseOperation, cases: FirebaseOperationCases): firebase.Promise<void>; 
} 

Ben benziyor evler, kaydetmek, silme ve güncelleme, göstermek için bir servis var şu:

@Injectable() 
export class HousesService { 
    private _houses$:FirebaseListObservable<IHouse[]>; 
    constructor(private af:AngularFire) { 
    this._houses$ = this.af.database.list('/houses'); 
    } 
    save(house:IHouse) { 
    if (house.hasOwnProperty('$key')) { 
     this._houses.update('/houses/'+house.$key).set(house); 
    } else { 
     this._houses$.push(house); 
    } 
    } 
    remove(id:any) { 
    this._houses$.remove(id); 
    } 
} 

houses$ olduğu FirebaseListObservable ve house listeden bir üründür. Ev aşağıdaki gibi görünen bir nesnedir:

Uncaught Error: Firebase.update failed: First argument contains an invalid key ($key) in path /$key. Keys must be non-empty strings and can't contain ".", "#", "$", "/", "[", or "]"

ben orijinal nesneyi koyarak denedim: Ben kaydetmeye çalıştığınızda

{ 
    name: "Mrs. Friendly", 
    notes: "Watch out for fence!", 
    street: "2530 Adams Ave.", 
    $key: "-KKQWsf26apDiXZNExZd" 
} 

/varolan öğeyi güncellemek, aşağıdaki hatayı alıyorum İlk parametre, tam URL'yi buraya koymanız ve düşünebileceğiniz hemen her kombinasyon. Gözlemlenebilir tanımına göre, _ref de orada çalışmalıdır. Ayrıca saklanacak verilerin anahtarını çekmeyi denedim ve hiçbir şey işe yaramıyor gibi görünüyor.

this.af.database.object('/houses/'+house.$key).set(house); 

ben güncelleme yöntemi çalışacak yüzden ilk parametre koymak olması gereken merak ediyorum: iş gibi görünüyor tek şey aşağıdaki tamamen güncelleme satırını kaldırın ve kullanmaktır. Ben Açısal 2 rc-1, Firebase 3.0.5 kullanıyorum

ve angularfire 2.0.0-beta.1

cevap

4
Angularfire sürümünüz biraz benimkinden ancak tasarruf yöntemi için eski

, bence sen güncellenmiş verileri içeren bir nesne ile birlikte (evin. $ anahtar) kaydetmek için evin anahtarını sadece geçebilir. $ Anahtar '/' ile başlayamaz çünkü

this._houses.update(house.$key, house); 

Ben '/ evler /' parçasını geçirerek düşünüyorum hata atılıyor.

+1

Bu hak hat boyunca, ancak ikinci argüman için, sadece güncellenmiş verileri koymak için gerekli, bu yüzden daha this._houses.update (ev $ anahtarı {lat benziyor. 1234, Ing : 5678}). Orijinal nesneyi koymak, anahtar üzerinde çakışmalara neden olur. – jloosli

+0

@jloosli Yorum için teşekkür ederiz. Nesnenin anahtarının ikinci argümanda kaldırılması gerekir. key = house. $ Key; ev sil. $ Anahtar; this._houses.update (anahtar, ev); – Amsakanna

0
var key = house.$key 
delete house.$key 
this._houses.update(key, house) 
İlgili konular