如何准备数组以插入到 Firebase 数据库中?
How to prepare arrays for insertion into Firebase database?
我有一个关于使用 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"
您已经在使用的 $firebaseArray
class 提供了 Firebase 的有序集合(其键使用推送 ID)和 AngularJS 的数组(使用常规数组)。
所以在控制器的构造函数中,不要为 itemList
创建本地数组,而是创建双向同步 $firebaseArray
:
$scope.newList = $firebaseArray(new Firebase("https://xxxxxx.firebaseio.com"));
您所指的博客 post 从那时起对 AngularFire 进行了大量更改。我强烈建议您完成 AngularFire development guide. It will take at most a few hours and will answer many more questions than just this one (which is covered in the 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 是建立在其之上的,它们将毫无问题地共存。
所以我没有一次性推送数组,而是简单地遍历其中的项目并推送它们中的每一个。
在这里 fiddle 工作:https://jsfiddle.net/frankvanpuffelen/vnh5dbwq/11/
我有一个关于使用 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"
您已经在使用的 $firebaseArray
class 提供了 Firebase 的有序集合(其键使用推送 ID)和 AngularJS 的数组(使用常规数组)。
所以在控制器的构造函数中,不要为 itemList
创建本地数组,而是创建双向同步 $firebaseArray
:
$scope.newList = $firebaseArray(new Firebase("https://xxxxxx.firebaseio.com"));
您所指的博客 post 从那时起对 AngularFire 进行了大量更改。我强烈建议您完成 AngularFire development guide. It will take at most a few hours and will answer many more questions than just this one (which is covered in the 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 是建立在其之上的,它们将毫无问题地共存。
所以我没有一次性推送数组,而是简单地遍历其中的项目并推送它们中的每一个。
在这里 fiddle 工作:https://jsfiddle.net/frankvanpuffelen/vnh5dbwq/11/