2016-06-17 6 views
5

Ich versuche, ein Element in einem FirebaseListObservable Objekt in einem Angular2 Projekt Angularfire2 mit zu aktualisieren. Die Definition für die FirebaseListObservable ist wie folgt:ein Element in einem FirebaseListObservable mit AngularFire aktualisiert 2

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

Ich habe einen Dienst zu zeigen, speichern, löschen und die Häuser aktualisieren, die wie folgt aussieht:

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

wo houses$ ist die FirebaseListObservable und house ist ein Element aus der Liste. House ist ein Objekt, das wie folgt aussieht:

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

Wenn ich versuche, ein vorhandenes Element zu speichern/aktualisieren, erhalte ich folgende Fehlermeldung:

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 "]"

Ich habe versucht, das ursprüngliche Objekt setzen in der erste Parameter, der die vollständige URL und fast jede denkbare Kombination enthält. Gemäß der Definition für das Observable sollte das _ref auch dort funktionieren. Ich habe auch versucht, die Schlüssel aus den Daten ziehen gespeichert werden und nichts scheint zu funktionieren. Das einzige, was zu funktionieren scheint, ist das Update Linie vollständig und verwenden Sie die folgenden entfernen:

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

Ich bin gespannt, was ich in den ersten Parameter gesetzt haben sollte, so würde die Update-Methode arbeiten.

I Angular 2 rc-1, Feuerbasis 3.0.5 bin mit und angularfire 2.0.0-beta.1

Antwort

4

Ihre Version von Angularfire ist etwas älter als meine, aber für Ihre Methode speichern, ich glaube, Sie kann den Schlüssel des Hauses übergeben, um (Haus. $ Schlüssel) zusammen mit einem Gegenstand zu speichern, der die aktualisierten Daten enthält.

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

Ich denke, indem man den ‚/ Häuser /‘ Teil, die Fehler ausgelöst wird, weil der Schlüssel $ nicht mit ‚/‘ beginnen.

+1

Dieses entlang der rechten Linie ist, aber für das zweite Argument, ich brauchte nur die aktualisierten Daten zu setzen, so sieht es eher wie this._houses.update (Haus $ key, {lat.: 1234, lng : 5678}). Wenn Sie das ursprüngliche Objekt einfügen, entsteht ein Konflikt auf dem Schlüssel. – jloosli

+0

@jloosli Danke für den Kommentar. Der Schlüssel des Objekts muss im zweiten Argument entfernt werden. Schlüssel = Haus. $ Schlüssel; Haus löschen. $ Key; this._houses.update (Schlüssel, Haus); – Amsakanna

0
var key = house.$key 
delete house.$key 
this._houses.update(key, house) 
Verwandte Themen