使用AngularFire 2更新FirebaseListObservable中的项目

时间:2016-06-17 22:00:44

标签: angular angularfire

我尝试使用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$FirebaseListObservablehouse是列表中的项目。 House是一个如下所示的对象:

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

当我尝试保存/更新现有项目时,出现以下错误:

  

未捕获错误:Firebase.update失败:第一个参数包含   路径/ $ key中的无效密钥($ key)。键必须是非空字符串   不能包含&#34;。&#34;,&#34;#&#34;,&#34; $&#34;,&#34; /&#34;,&#34; [&#34;,或&#34;]&#34;

我尝试将原始对象放在第一个参数中,将完整的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

2 个答案:

答案 0 :(得分:5)

您的Angularfire版本比我的版本略长,但是对于您的保存方法,我认为您可以通过房子的密钥保存(house。$ key)以及包含更新数据的对象。

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

我认为通过&#39; / houses /&#39;部分原因是错误被抛出,因为$ key不能以&#39; /&#39;开头。

答案 1 :(得分:1)

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