2013-07-16 30 views
17

Gần đây tôi đã bắt đầu học AngularJS + Firebase. Tôi đang cố gắng để viết trong căn cứ hỏa lực của tôi một đối tượng như thế này:

{ 
    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": "ім'я?(не фамілія)" }] 
    ] 
} 

với dòng:

lessondata.add($scope.topic); 

nơi 'lessondata' là dịch vụ tạo ra với angularFireCollection() và $ scope.topic - đối tượng ràng buộc vào giao diện người dùng của tôi. Nhưng gặp lỗi sau: Firebase.push không thành công: đối số đầu tiên chứa khóa không hợp lệ ($$ hashKey) trong thuộc tính 'say.0.0'. Phím phải là các chuỗi không rỗng và không thể chứa "", "#", "$", "/", "[" hoặc "]"


Như tôi hiểu căn cứ hỏa lực không cho phép sử dụng 0 làm khóa ngay cả khi đó là khóa trong một mảng được đính kèm mà khóa 0 là tự nhiên. Vì vậy, tôi nên thay đổi cấu trúc đối tượng của tôi trong một số trường hợp hardcoded hoặc tôi bỏ lỡ một cái gì đó? Cảm ơn trước!

Trả lời

6

Vấn đề là $ in "$$ hashKey", không được phép là 0.

24

EDIT: Như Anant chỉ ra trong các nhận xét, trong phiên bản ổn định mới nhất của Góc (1.0.7 atm), bạn có thể sử dụng angular.copy(obj) để xóa thuộc tính $$hashkey.

Giống như Michael đã nói, '$' trong '$$ hashKey' là vấn đề. Góc tạo ra các thuộc tính $$hashKey đằng sau hậu trường (xem chi tiết tại đây: https://groups.google.com/forum/#!topic/angular/pI0IgNHKjxw). Tôi đã nhận được xung quanh vấn đề này bằng cách thực hiện một cái gì đó như myRef.push(angular.fromJson(angular.toJson(myAngularObject))).

+1

Cool hack! Cảm ơn nhiều! – user2587800

+6

angular.copy() cũng nên loại bỏ thuộc tính $$ hashKey. – Anant

+0

Đẹp. Điều này đã giúp tôi khi lặp lại hiển thị dữ liệu với ng-repeat trước khi đẩy dữ liệu đến fb. Nó khá là hackish. =/ – Swordfish0321

3

Tôi muốn đưa ra một câu trả lời khác ở đây đơn giản hơn rất nhiều, chỉ cần sử dụng track by trong lần lặp lại của bạn. Nó sẽ loại bỏ thuộc tính $$hashKey gây ra rất nhiều đau buồn.

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

Hoạt động hoàn hảo. Tôi thậm chí không biết chỉ số $ là gì nhưng tôi chỉ lặp lại "theo dõi bởi chỉ số $" và nó là đủ. –

0

Bạn cũng có thể loại bỏ thuộc tính trước khi đẩy.

delete $scope.topic.$$hashKey 
1

Tôi hơi muộn nhưng tôi nghĩ tôi muốn thêm hai xu khi tôi lắc đầu với tất cả các câu trả lời khác. Hy vọng rằng điều này có thể giúp bạn tránh được vấn đề này cùng nhau.

Sử dụng thư viện góc AngireFire nhằm xử lý dữ liệu góc và sử dụng các phương pháp của nó.

trong khi có, bạn có thể sử dụng các phương thức thư viện javascript thuần túy để .push() .add() .update(), .set() ect. Vì vậy, nếu bạn muốn tránh mọi xung đột khi firebase giao tiếp với javascript góc , bạn cần phải sử dụng các phương thức .$foo() thích hợp (ví dụ: .$save()).Trong trường hợp của bạn chỉ cần thêm $ để bạn .add() (làm cho nó .$add())

nên sử dụng lessondata.$add($scope.topic);



khác biệt khi lưu với của căn cứ hỏa lực vs phương pháp $save() angularfire của


AngularFire là được triển khai bằng phương pháp set() của Firebase.

hoạt động push() căn cứ hỏa lực của tương ứng với $add() phương pháp AngularFire của

Thông thường bạn nên sử dụng set()/$ save() nếu bạn hoặc có một đối tượng đã tồn tại trong cơ sở dữ liệu hoặc nếu bạn đang làm việc với các đối tượng có khóa tự nhiên. biết thêm vào đó ở đây: https://stackoverflow.com/a/35959496/4642530



Những điều cần lưu ý với AngularFire


Đối với một callback:

và nếu bạn muốn có một callback để biết nếu dữ liệu của bạn được lưu một cách chính xác bạn có thể làm điều gì đó như sau:

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

Tôi đã rất ngạc nhiên vì điều này không được đề cập trước đó trong bất kỳ câu trả lời nào khác, nhưng hãy xem các tài liệu này https://www.firebase.com/docs/web/libraries/angular/api.html#angularfire-firebasearray-addnewdata

Chúc mừng.

1

Cách tốt nhất để thoát khỏi sự $$ hasKeys là sử dụng "theo dõi bằng cách" trong ng-lặp đi lặp lại như sau đây (như đã đề cập trong câu trả lời ở trên)

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

nhưng bạn cũng có thể thiết lập theo dõi dưới dạng ngang hàng ng-model-options

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

trên điều khiển biểu mẫu. Bằng cách này cũng cải thiện hiệu suất của ứng dụng góc cạnh của bạn.

Một cách khác là để loại bỏ các $$ hashKey đang sử dụng

angular.copy(someObj);

Nếu vẫn thất bại, bạn cũng có thể sử dụng lodash để loại bỏ các phím bắt đầu bằng "$".

_.omitBy(yourObject, function(value, key){return _.startsWith(key, '$');}); 
Các vấn đề liên quan