2016-06-17 8 views
5

Angularfire2を使用してAngular2プロジェクトのFirebaseListObservableオブジェクト内のアイテムを更新しようとしています。次のようにFirebaseListObservableの定義は次のとおりです。AngularFire 2を使用してFirebaseListObservable内のアイテムを更新する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>; 
} 

私はのように見える家を、保存、削除、および更新し、表示するサービスを持って、次の

@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はリストの項目です。家は次のようなオブジェクトです:

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

私は既存のアイテムを更新/保存しようとすると、私は次のエラーを取得する:

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

私は更新方法がうまくいくように、私は最初のパラメータに入れているべきか興味があります。私は角2 RC-1、firebase 3.0.5、およびangularfire 2.0.0-beta.1

答えて

4

にAngularfireのバージョンを使用してい

が私よりますが、あなたの方法を保存するための少し古いですが、私はあなたを考えます更新されたデータを含むオブジェクトとともに保存するハウスのキー(house。$ key)を渡すことができます。

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

私は$キーが「/」で始めることはできませんので、「/ハウス/」の部分を渡すことによって、エラーがスローされていると思います。

+1

これは、右のラインに沿っているが、2番目の引数のために、私はちょうど更新されたデータを入れるために必要なので、それはより多くのthis._houses.update(家$キー、{緯度のようになります。1234年、LNG :5678})。元のオブジェクトを配置すると、キーに競合が発生します。 – jloosli

+0

@jloosliコメントありがとうございます。 2番目の引数でオブジェクトのキーを削除する必要があります。 key = house。$ key; ハウスを削除する$ key; this._houses.update(key、house); – Amsakanna

0
var key = house.$key 
delete house.$key 
this._houses.update(key, house) 
関連する問題