1

在我的应用程序中有一个用户的情况下,我成功地使用了 AngularFire。

现在我已经启动并运行了身份验证,我注意到在切换用户时分配items$scope.items是灾难性的,主要是由于$scope未能正确更新。

直接从文档中读取...

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.providerand生成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 在接受的答案中的小提琴。

4

2 回答 2

2

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

angularFire承诺中的回调提供了一个“解除绑定”方法(参见此处此处):

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不会为您清除本地集合。但是,只要您知道它应该如何工作(并证明它确实有效),这里就是一个 fiddle

于 2013-10-20T23:29:10.753 回答
1

您需要在注销时取消绑定 $scope.items。最好的方法是将你的 promise 的 unbind 函数保存在 $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();
});
于 2013-10-21T21:56:28.317 回答