将新项添加到尚不存在的Firebase节点

时间:2014-05-03 05:21:11

标签: firebase angularfire

我在AngularFire应用程序中使用3向数据绑定。对于基于列表的节点,只要节点已存在,一切正常。但是,我所看到的是,包含节点必须被强制"首先进行某种$ update()调用。只是调用$ add()不会使节点存在。我现在正在使用我的代码,但在添加列表项之前,必须使用虚拟值更新节点,这肯定是一种黑客/解决方法。有人可以确认这是AngularFire 3路数据绑定的错误,还是我做错了什么?注意:直接使用Firebase push()API不会发生此问题。

这是一个可以展示的傻瓜。在“强制新项目”之后,“添加”按钮将无效。单击按钮。

http://plnkr.co/edit/q81Elp

1 个答案:

答案 0 :(得分:2)

解决方案

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

解释

这本身并不是一个错误。它源于null在Firebase中非常重要的特殊价值。在vanilla JS SDK中,获取值为null的快照意味着数据已加载,但根本没有任何内容。

这很重要,因为在您的代码中,空$scope.items(即没有强制值)需要null与Firebase的内联{{1}一致很重要。当我们通常在绑定到AngularFire中的作用域的数据上添加特殊$方法时,这可能会导致一些问题。因此,如果您的数据是数字(例如),我们可以轻松添加这些null方法。但是,有时数据将为$add,我们无法扩展null原型,就像我们可以扩展数字,字符串等的原型一样。

这使得AngularFire成为一个泡菜。它既不能与null上的Firebase的想法一致,也会对其绑定的数据提供AngularFire方法。它无法将方法放在null上导致您对null的调用产生错误。但是,一旦您放置了一些占位符值并且数据不是$add,那么AngularFire可以为您提供所有帮助方法,一切正常。

解决方案(如上所示)只是使用null而不是remoteItems.$add,因为返回的对象$scope.items.$add并不会尝试与您的Firebase数据相同,例如来自{的数据{1}}。这意味着,即使值为$firebase(...),从$firebase(...).$bind返回的对象也不会,并且所有方法(包括null)都可用。