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