向Firebase节点添加尚不存在的新项目

向Firebase节点添加尚不存在的新项目,firebase,angularfire,Firebase,Angularfire,我正在AngularFire应用程序中使用3路数据绑定。对于基于列表的节点,只要节点已经存在,一切都可以正常工作。然而,我看到的是,必须首先通过某种$update()调用“强制”包含节点的存在。仅调用$add()不会使节点存在。我的代码现在可以工作了,但在添加列表项之前,必须用一个伪值更新节点,这无疑感觉像是一种黑客/变通方法。有人能确认这是AngularFire 3路数据绑定的错误吗,或者我做错了什么?注意:直接使用Firebase push()API不会出现此问题 这里有一个plunker来

我正在AngularFire应用程序中使用3路数据绑定。对于基于列表的节点,只要节点已经存在,一切都可以正常工作。然而,我看到的是,必须首先通过某种$update()调用“强制”包含节点的存在。仅调用$add()不会使节点存在。我的代码现在可以工作了,但在添加列表项之前,必须用一个伪值更新节点,这无疑感觉像是一种黑客/变通方法。有人能确认这是AngularFire 3路数据绑定的错误吗,或者我做错了什么?注意:直接使用Firebase push()API不会出现此问题

这里有一个plunker来演示。单击“强制新建项目”按钮后,“添加”按钮才会工作

解决方案 使用
remoteItems.$add
而不是
$scope.items.$add

var app = angular.module('plunker', ['firebase']);

  app.controller('MainCtrl', function($scope, $firebase) {

  var fbUrl = 'https://awlcsrqri89.firebaseio-demo.com/';
  var baseRef = new Firebase(fbUrl);
  var newListRef = baseRef.child('parent/newlist');
  var remoteItems = $firebase(newListRef);

  remoteItems.$bind($scope, "items");

  $scope.addItem = function() {
    var newObj = {id: 'abc', name: 'test'};
    remoteItems.$add(newObj);
  };
});
解释 这本身不是一个bug。它源于
null
是Firebase中非常重要的特殊值这一事实。在vanilla JS SDK中,获取值为
null
的快照意味着数据已经加载,但根本没有任何内容

这一点很重要,因为在您的代码中,空的
$scope.items
(即,没有强制值)需要
null
,才能与Firebase的
null
非常重要的思想相一致。当我们在AngularFire中将特殊$methods添加到绑定到您的作用域的数据时,这可能会导致一些问题。因此,如果您的数据是一个数字(例如),我们可以轻松添加这些
$add
方法。然而,有时数据将是
null
,我们不能像扩展数字、字符串等的原型那样扩展
null
原型

这就使得AngularFire陷入困境。它不能既与Firebase关于
null
的思想保持一致,又对绑定的数据提供AngularFire方法。它不能将方法放在
null
上,这会导致调用
$add
抛出错误。但是,一旦您输入了一些占位符值,并且数据变为非
null
,AngularFire就可以为您提供所有的帮助器方法,并且一切正常


解决方案(如上所示)只是使用
remoteItems.$add
而不是
$scope.items.$add
,因为
$firebase(…)
返回的对象不会像
$firebase(…)。$bind
返回的数据那样试图与您的firebase数据相同。这意味着,即使值应为
null
,从
$firebase(…)
返回的对象也将不可用,并且将具有所有可用方法(包括
$add

谢谢大家!!现在有道理了。事实上,经过进一步的实验,我仍然有一个问题。我同意您总是希望对远程引用调用$add()。原来我的Plunkr没有准确地捕捉到这个问题。它归结为对不存在的远程引用调用$bind()。如果随后更新本地模型,则三向绑定不起作用。似乎违背了三向绑定的意图。您通常希望将UI输入绑定到本地作用域,但如果调用$bind()时远程引用最初为空,则不会更新远程引用。您能为我提供重现此问题的方法吗?如果你不能主持,只需通过电子邮件将文件发送给我abe@firebase.com