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