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
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
@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