在我的应用程序中有一个用户的情况下,我成功地使用了AngularFire。
现在我已启动并运行身份验证,我注意到在切换用户时将items
分配给$scope.items
是灾难性的,主要原因是$scope
无法正确更新。< / p>
直接从文档中阅读...
var ref = new Firebase('https://<my-firebase>.firebaseio.com/items');
angularFire(ref, $scope, 'items');
我需要这些只是当前授权用户的items
。所以目前,我这样做(如果有更好的方法,请不要犹豫告诉我!)
var ref = new Firebase('https://<my-firebase>.firebaseio.com/items/userId');
angularFire(ref, $scope, 'items');
我使用userId
和auth.provider
生成auth.id
,顺便说一句。现在,我的项目已命名为user1
var ref = new Firebase('https://<my-firebase>.firebaseio.com/items/[user1id]');
angularFire(ref, $scope, 'items');
我将商品添加到$scope.items
$scope.create = function(item) {
$scope.items.push(item)
/* Pretend the user adds these from the interface.
[
{ name: 'eenie' },
{ name: 'meenie' },
{ name: 'miney' },
{ name: 'moe' }
]
*/
}
问题
现在,如果我只是注销并以其他人身份登录,那么奇怪的是该用户有eenie meenie miney
和moe
,因为$scope.items
在注销和登录之间保存了数组。
我尝试在注销事件上设置$scope.items = []
,但这实际上清空了所有记录。我把头发拉了出来。这是我在项目中需要做的0.001%,这是整个周末。
更新新方法
$scope.create = function() {
$scope.selectedDevice = {
name: 'New Device',
userId: $scope.user.provider + $scope.user.id
};
return $scope.devices.push($scope.selectedDevice);
};
$scope.$on('angularFireAuth:login', function(evt, user) {
var promise, ref;
ref = new Firebase('https://mysite.firebaseio.com/users/' + (user.provider + user.id) + '/registry/');
promise = angularFire(ref, $scope, 'devices');
});
现在它将准确地在用户的id下创建项目。但是,一旦您注销并重新登录,这些项目就不会从$scope.devices
中清除。因此,他们只是将自己添加到数据中,但是在新登录的用户下。
更新
我做了很多试验和错误。我可能会将$scope.devices
设置为[]
并在每个可能的组合中移动登录事件。最终奏效的是@ hiattp在接受的答案中的小提琴。
答案 0 :(得分:2)
这是在切换用户时隐式数据绑定保持不变的结果。如果新用户显示并创建新绑定,它会认为现有数据是应该同化的本地更改(这就是为什么您看到原始用户的项目被添加到新用户) ,但如果您尝试在不释放绑定的情况下首先清除它们,那么您隐含地告诉Firebase从原始用户的项目列表中删除该数据(也不是您想要的)。因此,当您根据需要检测到注销(或登录)事件时,需要释放数据绑定。
angularFire
承诺中的回调提供了一个&#34; unbind&#34;方法(参见here和here):
var promise = angularFire(ref, $scope, 'items');
promise.then(function(unbind){
// Calling unbind() will disassociate $scope.items from Firebase
// and generally it's useful to add unbind to the $scope for future use.
});
您的代码中有一些可能导致其无法工作的特性,请记住unbind
不会为您清除本地集合。但只是让你知道应该如何工作(以及证明它 工作)这里是a fiddle。
答案 1 :(得分:1)
您需要在注销时取消绑定$ scope.items。执行此操作的最佳方法是在$ scope中保存为您的承诺提供的解除绑定功能:
var ref = new Firebase('https://<my-firebase>.firebaseio.com/items/[user1id]');
angularFire(ref, $scope, 'items').then(function(unbind) {
$scope.unbindItems = unbind;
});
$scope.$on('angularFireAuth:logout', function() {
$scope.unbindItems();
});