2016-06-17 16 views
5

Sto tentando di aggiornare un elemento in un oggetto FirebaseListObservable in un progetto Angular2 utilizzando Angularfire2. La definizione per il FirebaseListObservable è la seguente:Aggiornamento di un elemento in FirebaseListObservable utilizzando AngularFire 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>; 
} 

Ho un servizio per mostrare, salvare, eliminare e aggiornare le case che è simile al seguente:

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

dove houses$ è il FirebaseListObservable e house è un elemento dall'elenco. House è un oggetto che è simile al seguente:

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

Quando cerco di salvare/aggiornare un elemento esistente, ricevo il seguente errore:

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

Ho provato a mettere l'oggetto originale in il primo parametro, inserendo l'URL completo lì, e quasi tutte le combinazioni a cui puoi pensare. Secondo la definizione per l'Observable, il _ref dovrebbe funzionare anche lì. Ho anche provato a estrarre la chiave dai dati da memorizzare e nulla sembra funzionare. L'unica cosa che sembra funzionare è quello di rimuovere la linea di aggiornamento completamente e utilizzare il seguente:

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

Sono curioso quello che avrei dovuto mettere nel primo parametro in modo che il metodo di aggiornamento avrebbe funzionato.

sto usando angolare 2 rc-1, 3.0.5 Firebase e angularfire 2.0.0-beta.1

risposta

4

La tua versione di Angularfire è leggermente più vecchio di mio, ma per il metodo di salvataggio, io pensi può solo passare la chiave della casa per salvare (casa. $ chiave) insieme ad un oggetto contenente i dati aggiornati.

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

penso che facendo passare il '/ Case /' parte, l'errore viene generato perché la chiave di $ non può iniziare con '/'.

+1

Questo è lungo la linea giusta, ma per il secondo argomento, avevo bisogno di mettere solo i dati aggiornati, in modo che appaia più come this._houses.update (casa $ chiave, {lat. 1234, lng : 5678}). L'inserimento dell'oggetto originale causa un conflitto sulla chiave. – jloosli

+0

@jloosli Grazie per il commento. La chiave dell'oggetto deve essere rimossa nel secondo argomento. chiave = casa. $ Chiave; cancella casa. $ Chiave; this._houses.update (chiave, casa); – Amsakanna

0
var key = house.$key 
delete house.$key 
this._houses.update(key, house) 
Problemi correlati