防止范围内的项目写入不同用户的记录

时间:2013-10-20 19:55:13

标签: firebase angularfire

在我的应用程序中有一个用户的情况下,我成功地使用了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');

我使用userIdauth.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 mineymoe,因为$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在接受的答案中的小提琴。

2 个答案:

答案 0 :(得分:2)

这是在切换用户时隐式数据绑定保持不变的结果。如果新用户显示并创建新绑定,它会认为现有数据是应该同化的本地更改(这就是为什么您看到原始用户的项目被添加到新用户) ,但如果您尝试在不释放绑定的情况下首先清除它们,那么您隐含地告诉Firebase从原始用户的项目列表中删除该数据(也不是您想要的)。因此,当您根据需要检测到注销(或登录)事件时,需要释放数据绑定。

angularFire承诺中的回调提供了一个&#34; unbind&#34;方法(参见herehere):

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();
});