【问题标题】:Updating an item in a FirebaseListObservable using AngularFire 2使用 AngularFire 2 更新 FirebaseListObservable 中的项目
【发布时间】:2017-06-06 16:51:34
【问题描述】:

我正在尝试使用 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)。键必须是非空字符串,并且 不能包含“.”、“#”、“$”、“/”、“[”或“]”

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

【问题讨论】:

    标签: angular angularfire


    【解决方案1】:

    您的 Angularfire 版本比我的稍旧,但对于您的保存方法,我认为您可以只传递要保存的房子的密钥 (house.$key) 以及包含更新数据的对象。

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

    我认为通过传递 '/houses/' 部分会引发错误,因为 $key 不能以 '/' 开头。

    【讨论】:

    • 这是正确的,但是对于第二个参数,我只需要放置更新的数据,所以它看起来更像这样。_houses.update(house.$key, {lat:1234 ,液化天然气:5678})。将原始对象放入会导致键冲突。
    • @jloosli 感谢您的评论。需要在第二个参数中删除对象的键。钥匙=房子。$钥匙;删除房子.$key; this._houses.update(key, house);
    【解决方案2】:
    var key = house.$key
    delete house.$key
    this._houses.update(key, house)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      • 1970-01-01
      相关资源
      最近更新 更多