使用隐式更新(angelFire)时没有问题。但是我需要一些我的数据使用显式更新。所以我在之前使用的完全相同的ref上实现了angelFireCollection
但是尽管console.log明确说明了读取被授予并且使用onloadcallback
并且没有使用它,我没有得到数据直接进入我指定的变量AND一旦回调触发我得到一个奇怪的外观对象,它包含数据但不是我期望的形式。我的范围变量以空集合结束。从来没有人口稠密。这是代码:
var streamController = function ($rootScope, $scope, $log, $location, angularFireCollection, profileService) {
//Wait for firebaseLogin...
$rootScope.$watch('firebaseAuth', init);
function init() {
if ($rootScope.firebaseAuth == false) {
return
};
var refUsers = new Firebase($rootScope.FBURL+'/users/'+$rootScope.uid);
$scope.profile = angularFireCollection(refUsers, function onload(snapshot) {
console.log(snapshot)
});
};
};
myApp.gwWebApp.controller('StreamController', ['$rootScope', '$scope', '$log', '$location', 'angularFireCollection', 'profileService',
streamController]);
}());
这是console.log的样子(即;什么快照看起来像):
>snapshot
T {z: R, bc: J, V: function, val: function, xd: function…}
以下是返回快照之前的消息:
Firebase Login Succeeded! fbLoginController.js:16
FIREBASE: Attempt to read /users/529ccc5d1946a93656320b0a with auth={"username":"xxxxxxx@me.com","id":"529ccc5d1946a93656320b0a"} firebase.js:76
FIREBASE: /: "auth.username == 'admin'" firebase.js:76
FIREBASE: => false firebase.js:76
FIREBASE: /users firebase.js:76
FIREBASE: /users/529ccc5d1946a93656320b0a: "auth.id == $user" firebase.js:76
FIREBASE: => true firebase.js:76
FIREBASE:
FIREBASE: Read was allowed.
最后是一个以空数组结束的所需绑定:再次来自控制台:
$ scope.profile []
任何人都知道我可能做错了什么?这就像5行代码。令人沮丧。
我已在angelFireCollection
工厂函数中设置了止值,并且可以看到数据已添加到该函数内部回调中的集合中,但我的binded变量永远不会更新。
UPDATE
好的试验一个plnkr。似乎angularFireCollection
预示您返回项目列表。如果检查snapshot.val()
,快照将正确返回,它将是firebase中存储的任何对象结构。如果您使用angularFireCollection
它确实绑定到变量HOWEVER它将非列表对象变成乱码并且您无法访问对象用户普通点运算符。这可能是一个错误,也可能是angularFireCollection
的严重限制,这将导致我重新评估使用firebase作为后端的容易程度。我无法分享我的plnkr,因为它正在访问非公开数据,但明天如果我有时间,我将创建一个带有对象存储的公共firebase并进行演示。
答案 0 :(得分:0)
确定。因此看起来确实angularFireCollection是基于数组的。哪个好。如果更新angularFire文档以使其清楚,那将非常有用。因此,它不是隐式vs显式更新技术。
对于基于非数组的显式方法,我提出了以下代码。如果我没有被文档误导,我本来会走这条路。
var MainCtrl = function($scope, angularFire) {
$scope.test = {};
var _url = 'https://golfwire.firebaseio.com/tmp';
var _ref = new Firebase(_url);
var promise = angularFire(_ref, $scope, 'implicit');
promise.then ( function(data){
$scope.explicit=angular.copy($scope.implicit );
});
}
然后使用'显式'副本在本地工作,准备好后只需通过赋值更新'隐式':$ scope.implicit = $ scope.explicit。
这是一个plnkr:http://plnkr.co/edit/bLJrL1