如何准备数组以插入Firebase数据库?

时间:2015-05-20 15:26:27

标签: arrays angularjs firebase angularfire

我有一个关于使用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"

1 个答案:

答案 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建立在它之上,它们将共存而没有问题。

因此,我不是一次性推动数组,而是简单地遍历其中的项目并推送它们。

在这里工作小提琴:https://jsfiddle.net/frankvanpuffelen/vnh5dbwq/11/