使用angularfire推送/添加到firebase的重复数据

时间:2015-09-02 01:44:32

标签: firebase angularfire

是否有办法(可能使用规则)在add / push to 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"});
  }
};

并且希望我只有一个调用而不是重复的调用/代码,但是在两个数组(项目和队列)中都有结果。

非常感谢!

2 个答案:

答案 0 :(得分:1)

永远记住,AngularFire是Firebase的JavaScript SDK相对较薄的包装器,有助于将数据绑定到AngularJS视图中。如果您没有尝试绑定并且某些内容不是很明显,那么您通常会在documentation of Firebase's JavaScript SDK中找到更多/更好的信息。

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()会返回将项目添加到Firebase时履行的承诺。有了这些知识,您可以将同名的子项添加到其他列表中:

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()绑定到相同的数据,它们也会在那里实时更新。

答案 1 :(得分:1)

弗兰克的答案是权威的。另外一个想法是AngularFire非常extensible

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

javax.portlet.request