如何准备数组以插入到 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/