使用 angularfire 将 push/add 上的数据复制到 firebase

Duplicate data on push/add to firebase using angularfire

有没有办法(可能使用规则)将 add/push 上的数据复制到 firebase?

我想要存档的是当我添加到 firebase 数组时我想将数据复制到另一个数组。

所以这是我的 firebase 结构:

my-firebase: {
  items: [ ... ],
  queue: [ ... ]
}

这就是我定义服务的方式:

.factory('Service1',['$firebaseArray', function($firebaseArray) {
  var items =  new Firebase('my-firebase.firebaseio.com/items');
  return $firebaseArray(items);
}])

.factory('Service2',['$firebaseArray', function($firebaseArray) {
  var queue =  new Firebase('my-firebase.firebaseio.com/queue');
  return $firebaseArray(queue);
}])

下面是我如何使用它们:

.controller('controller', function($scope, Service1, Service2) {  

  $scope.save = function() {  
    Service1.$add({name: "test1"});
    Service2.$add({name: "test1"});
  }
};

并希望我进行一次调用而不是重复调用 call/code 但在两个数组(项目和队列)中都有结果。

非常感谢!

永远记住,AngularFire 是 Firebase JavaScript SDK 的一个相对薄的包装器,有助于将数据绑定到您的 AngularJS 视图中。如果您不尝试绑定并且某些事情不是很明显,您通常会在 documentation of Firebase's JavaScript SDK.

中找到 more/better 信息

API documentation for $firebaseArray.$add() 对此很有帮助。从那里:

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

所以 $add() returns 当项目被添加到 Firebase 时履行的承诺。有了这些知识,您可以将 same-named child 添加到另一个列表:

var queue =  new Firebase('my-firebase.firebaseio.com/queue');
$scope.save = function() {  
  Service1.$add({name: "test1"}).then(function(ref) {
    queue.child(ref.key().set({name: "test1"});
  });
}

最后一个片段使用了常规的 Firebase 参考。由于 AngularFire 构建在 Firebase JavaScript SDK 之上,因此它们可以完美地协同工作。事实上:除非你将这些 $firebaseArray 绑定到 $scope,你最好不要为它们使用 AngularFire:

var items =  new Firebase('my-firebase.firebaseio.com/items');
var queue =  new Firebase('my-firebase.firebaseio.com/queue');
$scope.save = function() {
  var ref = queue.push();
  ref.set({name: "test1"})
  queue.child(ref.key().set({name: "test1"});
}

在我看来,这更容易阅读,因为我们跳过了一个未被使用的层。即使在代码的其他地方,您将 $firebaseArray()$firebaseObject() 绑定到相同的数据,它们也会在 real-time 中更新。

弗兰克的回答很权威。这里的另一个想法是 AngularFire 非常 extensible.

如果你想将数据推送到两个路径,你可以简单地覆盖 $add 方法并同时将更新应用到第二个路径:

app.factory('DoubleTap', function($firebaseArray, $q) {
   var theOtherPath = new Firebase(...);
   return $firebaseArray.$extend({
      $add: function(recordOrItem) {
         var self = this;
         return $firebaseArray.prototype.$add.apply(this, arguments).then(function(ref) {
             var rec = self.$getRecord(ref.key());
             var otherData = ...do something with record here...;
             return $q(function(resolve, reject) {
                 theOtherPath.push(rec.$id).set(otherData);
             });
         });
      }
   });
});