2013-07-16 25 views
17

私は最近、AngularJS + Firebaseを学び始めました。バインドされたオブジェクト -

'lessondata' はangularFireCollection()と$ scope.topicで作成したサービスである
lessondata.add($scope.topic); 

:行と

{ 
    title: "Personal Information", 
    say: [ 
     [{ "eng": "What's", "ukr": "Що є" }, { "eng": "your", "ukr": "твоє" }, { "eng": "surname?", "ukr": "прізвище?" }], 
     [{ "eng": "Smith", "ukr": "Сміт" }], 
     [{ "eng": "What's", "ukr": "Що є" }, { "eng": "your", "ukr": "твоє" }, { "eng": "first", "ukr": "перше" }, { "eng": "name?", "ukr": "ім'я?(не фамілія)" }] 
    ] 
} 

:私は私のfirebaseでこのようなオブジェクトを作成しようとしています私のUIに。 しかし、次のエラーました: Firebase.pushに失敗しました:最初の引数は、プロパティに無効なキー($$ハッシュキー)「say.0.0」が含まれています。私はFirebaseを理解できるようにキーが


"["、または "]" しない非空の文字列である必要があり、含めることはできません ""、 "#"、 "$"、 "/"、たとえキーがゼロの自然なアタッチド・アレイのキーであっても、0をキーとして使用することができます。だから、ハードコーディングされたインスタンスでオブジェクト構造を変更する必要がありますか?前もって感謝します!

答えて

6

問題は「$$ハッシュキー」で$で、0 0は許可されません。

24

EDIT:Anantは、最新の安定版Angular(1.0.7 atm)では、angular.copy(obj)を使用して$$hashkeyの属性を削除できます。

マイケルは「$$ハッシュキー」内の「$」の問題です。、言ったように角度は(:https://groups.google.com/forum/#!topic/angular/pI0IgNHKjxwをもっとここを参照してください)舞台裏$$hashKeyプロパティを作成します。私はmyRef.push(angular.fromJson(angular.toJson(myAngularObject)))のようなことをしてこの問題を回避しました。

+1

クールハック!どうもありがとうございました! – user2587800

+6

angular.copy()は、$$ hashKeyプロパティも削除する必要があります。 – Anant

+0

ニース。これは、データをfbにプッシュする前にng-repeatでデータを繰り返し表示するときに役立ちました。しかし、それはかなりハッキーです。 =/ – Swordfish0321

3

私はちょうどあなたの繰り返しでtrack byを使用し、はるかに簡単です、ここでは別の答えを投げたかったです。それはあまりにも多くの悲しみを引き起こしている属性を取り除くでしょう。

<div ng-repeat="item in items track by $index">{{item.name}}</div> 
+0

完璧に動作します。私は$インデックスが何であるか知りませんでしたが、私はちょうど "$ index by track"を繰り返しました。 –

0

また、プッシュする前にプロパティを削除することもできます。

delete $scope.topic.$$hashKey 
1

私はこれに少し遅れが、私は私が他のすべての答えに私の頭を振ったとして、私の2セントを追加したいと思いました。うまくいけば、この問題をすべて回避するのに役立ちます。

は角度データを処理し、それは方法だ使用することを意図しangularFireライブラリを使用してください。

はい、あなたは.push() .add() .update().set()などに純粋なjavascriptライブラリメソッドを使用できます。あなたが任意の衝突を避けたい場合は

だからfirebaseは、あなたが適切な.$foo()方法(すなわち.$save())を使用する必要が角度JavaScriptを使用して通信するとき。あなたのケースでは、ちょうどあなたの.add()$を追加(これ.$add()作る)

angularfireの


AngularFireの$save()方法がある対firebase年代に保存するときにlessondata.$add($scope.topic);



違いを使用Firebaseのset()メソッドを使用して実装されています。

Firebaseのpush()操作がAngularFireの$add()方法

通常

あなたがセットを(使用する必要があります)あなたが作業している場合は、すでにデータベースに存在するかのオブジェクトを持っているいずれかの場合/ $)(セーブに対応します自然なキーを持つオブジェクト。ここでその上 詳細:AngularFireコールバックの


で注意すべきhttps://stackoverflow.com/a/35959496/4642530



もの:

、あなたのデータが正しく保存されている場合、コールバックを知りたい場合次のようなことができます:

var list = $firebaseArray(ref); 
list.$add({ foo: "bar" }).then(function(ref) { 
    var id = ref.key(); 
    console.log("added record with id " + id); 
    list.$indexFor(id); // returns location in the array 
}); 

私はこれが他の回答のいずれにも言及されていないことに驚いたが、これらの文書を見てください。https://www.firebase.com/docs/web/libraries/angular/api.html#angularfire-firebasearray-addnewdata

乾杯。

1

$$ hasKeysを取り除くための最善の方法は、(上記の回答で述べたように)以下の

<div ng-repeat="(key, value) in myObj track by $index"> ... </div> 

のようにNG-繰り返しで「でトラック」を使用することですが、あなたにも設定することができますng-model-optionsの行としてのトラック

ng-model-options="{ trackBy: '$value.someKeyOnYourObject' }" 

フォームコントロール上。この方法でも、角型アプリケーションのパフォーマンスが向上します。

もう一つの方法は、あなたはまた、「$」で始まるキーを削除するlodashを使用することができ、他のすべてが失敗した場合$$ハッシュキーが

angular.copy(someObj);

を使用している削除することです。

_.omitBy(yourObject, function(value, key){return _.startsWith(key, '$');}); 
関連する問題