2016-06-17 14 views
5

Próbuję zaktualizować obiekt w obiekcie FirebaseListObservable w projekcie Angular2 przy użyciu Angularfire2. Definicja dla FirebaseListObservable jest następujący:Aktualizowanie elementu w FirebaseListObservable przy użyciu 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>; 
} 

Mam usługę, aby pokazać, zapisywać, usuwać i aktualizować domów, które wygląda następująco:

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

gdzie houses$ jest FirebaseListObservable i house jest przedmiotem z listy. Dom jest obiektem, który wygląda następująco:

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

Gdy próbuję zapisać/zaktualizować istniejący element, pojawia się następujący błąd:

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

próbowałam wprowadzenie oryginalnego obiektu w pierwszy parametr, umieszczenie pełnego adresu URL i prawie każdą kombinację, którą możesz wymyślić. Zgodnie z definicją dla obserwowalnego, _ref powinien również tam działać. Próbowałem również wyciągnąć klucz z danych, które mają być przechowywane i nic nie działa. Jedyną rzeczą, która wydaje się działać to, aby usunąć linię aktualizacji całkowicie i użyć następujących:

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

Jestem ciekaw co powinienem umieścić w pierwszym parametrze więc metoda aktualizacji będzie działać.

Używam kątowa 2 RC-1, Firebase 3.0.5, 2.0.0 i angularfire-beta.1

Odpowiedz

4

Twoja wersja Angularfire jest nieco starsza niż kopalnia ale dla ratowania metody, myślę, że może po prostu przekazać klucz do domu, aby zapisać (dom. $ klucz) wraz z obiektem zawierającym zaktualizowane dane.

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

myślę o przejściu „/ dom /” część, błąd jest generowany, ponieważ kluczem $ nie może zaczynać się od „/”.

+1

Jest wzdłuż prawej linii, ale dla drugiego argumentu, musiałem po prostu umieścić zaktualizowane dane, więc wygląda bardziej jak dom this._houses.update ($ klucz {szer. 1234, LNG : 5678}). Umieszczenie oryginalnego obiektu powoduje konflikt na kluczu. – jloosli

+0

@jloosli Dzięki za komentarz. Klucz obiektu musi zostać usunięty w drugim argumencie. key = house. $ Key; usuń dom. $ Key; this._houses.update (klucz, dom); – Amsakanna

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