我有一个关于使用AngularFire向Firebase添加数组的问题。让我们从一个简单的例子开始。当我的前端用户创建列表时,我倾向于做的事情是这样的:
angular.module("app", ["firebase"])
.controller("createListCtrl", function($scope, $firebaseArray) {
console.log("controller loaded");
$scope.newList = [];
$scope.addItemToList = function(itemlist) {
console.log(itemlist);
$scope.newList.push({
"item": itemlist,
"done": false
});
}
$scope.sendToDb = function() {
var ref = new Firebase("https://xxxxxx.firebaseio.com");
var list = $firebaseArray(ref);
list.$add({
"list": $scope.newList
}).then(function(ref) {
var id = ref.key();
console.log("added record with id " + id);
console.log(list.$indexFor(id)); // returns location in the array
})
}
一切都很好,花花公子,一切都很好,但我读了这篇文章: https://www.firebase.com/blog/2014-04-28-best-practices-arrays-in-firebase.html
我听到更多人说要避免使用数组,我在Firebase中看到了数组的问题,但是替代方案是什么,文章说这个结构:
{foo: {counter: 1}, bar: {counter: 1}, baz: {counter: 1}};
这真的是一个更好的结构吗?我认为它变得混乱,我甚至不知道如何从这样的结构开始实现这个结构:$scope.newList = {};
。用数组做这件事真的很麻烦吗?阵列在Firebase中真的很邪恶吗?提前感谢您的解释或更好的选择。
修改
列表存储在Firebase中的方式似乎不太好:
---uniqueID
---list
---0
---done:false
---item:"item1"
---1
---done:false
---item:"item2"
---2
---done:false
---item:"item3"
答案 0 :(得分:1)
您已经使用的$firebaseArray
类提供了Firebase的有序集合(使用其键的推送ID)和AngularJS的数组(使用它们)之间的映射常规数组)。
因此,在您的控制器构造函数中,而不是为itemList
创建本地数组,创建一个双向同步$firebaseArray
:
$scope.newList = $firebaseArray(new Firebase("https://xxxxxx.firebaseio.com"));
您所指的博客文章是此后AngularFire进行相当多更改的基础。我强烈建议您完成AngularFire development guide。它最多只需要几个小时,并且会回答更多问题,而不仅仅是这个问题(section on synchronized arrays中有这个问题)。
感谢您的更新。我现在得到你想要做的事。因此,您最初只想保留客户端项目列表,然后立即将其保存到Firebase。
在这种情况下,我会像这样写sendToDb
:
$scope.sendToDb = function () {
var ref = new Firebase("https://xxxxxx.firebaseio.com");
var listRef = ref.push();
$scope.newList.forEach(function(item) {
var itemRef = listRef.push({ item: item.item, done: item.done });
console.log('Added item with key: '+itemRef.key());
});
}
这使用常规的Firebase JavaScript SDK。但是,由于AngularFire建立在它之上,它们将共存而没有问题。
因此,我不是一次性推动数组,而是简单地遍历其中的项目并推送它们。