使用 AngularFire 2 更新 FirebaseListObservable 中的项目
Updating an item in a FirebaseListObservable using AngularFire 2
我正在尝试使用 Angularfire2 更新 Angular2 项目中 FirebaseListObservable 对象中的项目。 FirebaseListObservable 的定义如下:
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>;
}
我有一项服务可以显示、保存、删除和更新如下所示的房屋:
@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);
}
}
其中 houses$
是 FirebaseListObservable
而 house
是列表中的项目。 House 是一个如下所示的对象:
{
name: "Mrs. Friendly",
notes: "Watch out for fence!",
street: "2530 Adams Ave.",
$key: "-KKQWsf26apDiXZNExZd"
}
当我尝试 save/update 现有项目时,出现以下错误:
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 "]"
我试过将原始对象放在第一个参数中,然后将完整的 URL 放在那里,以及几乎所有您能想到的组合。根据 Observable 的定义,_ref 也应该在那里工作。我也试过从要存储的数据中提取密钥,但似乎没有任何效果。唯一似乎有效的是完全删除更新行并使用以下内容:
this.af.database.object('/houses/'+house.$key).set(house);
我很好奇我应该在第一个参数中输入什么,这样更新方法才能工作。
我正在使用 Angular 2 rc-1、firebase 3.0.5 和 angularfire 2.0.0-beta.1
你的 Angularfire 版本比我的稍旧,但是对于你的保存方法,我认为你可以传递要保存的房子的钥匙 (house.$key) 以及包含更新数据的对象。
this._houses.update(house.$key, house);
我认为传递 '/houses/' 部分会引发错误,因为 $key 不能以 '/' 开头。
var key = house.$key
delete house.$key
this._houses.update(key, house)
我正在尝试使用 Angularfire2 更新 Angular2 项目中 FirebaseListObservable 对象中的项目。 FirebaseListObservable 的定义如下:
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>;
}
我有一项服务可以显示、保存、删除和更新如下所示的房屋:
@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);
}
}
其中 houses$
是 FirebaseListObservable
而 house
是列表中的项目。 House 是一个如下所示的对象:
{
name: "Mrs. Friendly",
notes: "Watch out for fence!",
street: "2530 Adams Ave.",
$key: "-KKQWsf26apDiXZNExZd"
}
当我尝试 save/update 现有项目时,出现以下错误:
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 "]"
我试过将原始对象放在第一个参数中,然后将完整的 URL 放在那里,以及几乎所有您能想到的组合。根据 Observable 的定义,_ref 也应该在那里工作。我也试过从要存储的数据中提取密钥,但似乎没有任何效果。唯一似乎有效的是完全删除更新行并使用以下内容:
this.af.database.object('/houses/'+house.$key).set(house);
我很好奇我应该在第一个参数中输入什么,这样更新方法才能工作。
我正在使用 Angular 2 rc-1、firebase 3.0.5 和 angularfire 2.0.0-beta.1
你的 Angularfire 版本比我的稍旧,但是对于你的保存方法,我认为你可以传递要保存的房子的钥匙 (house.$key) 以及包含更新数据的对象。
this._houses.update(house.$key, house);
我认为传递 '/houses/' 部分会引发错误,因为 $key 不能以 '/' 开头。
var key = house.$key
delete house.$key
this._houses.update(key, house)