Zapobiegaj zakresowi od zapisywania do rekordów innego użytkownika

Miałem sukces w używaniu AngularFire w scenariuszu, w którym w mojej aplikacji jest jeden użytkownik.

Teraz, gdy mam uwierzytelnianie i działa, zauważam, że przypisujęitems do$scope.items jest katastrofalny przy zmianie użytkowników, głównie z powodu$scope nie można poprawnie zaktualizować.

Czytanie bezpośrednio z dokumentów ...

var ref = new Firebase('https://<my-firebase>.firebaseio.com/items');
angularFire(ref, $scope, 'items');

Muszę, żeby były tylkoitems aktualnie autoryzowanego użytkownika. Obecnie robię to (jeśli jest lepszy sposób, nie wahaj się powiedzieć mi!)

var ref = new Firebase('https://<my-firebase>.firebaseio.com/items/userId');
angularFire(ref, $scope, 'items');

GenerujęuserId za pomocąauth.provider iauth.id, btw. Teraz, gdy moje elementy są oznaczone nazwami (powiedzmy)user1

var ref = new Firebase('https://<my-firebase>.firebaseio.com/items/[user1id]');
angularFire(ref, $scope, 'items');

Dodaję elementy do$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' }
  ]
  */

}

Problem

Teraz, jeśli wyloguję się i zaloguję jako ktoś inny, magicznie ten użytkownik maeenie meenie miney imoe bo$scope.items trzymał tablicę między wylogowaniem a logowaniem.

Próbowałem ustawić$scope.items = [] przy zdarzeniu wylogowania, ale w rzeczywistości usuwa wszystkie rekordy. Wyciągam włosy. To jest 0,001% tego, co muszę zrobić w moim projekcie i to zajmuje cały mój weekend.

Aktualizacja Nowa metoda

  $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');
  });

Teraz będzie dokładnie tworzyć elementy pod identyfikatorem użytkownika. Jednak po wylogowaniu i ponownym zalogowaniu się te elementy nie zostaną usunięte$scope.devices. Dlatego po prostu dodają się do danych, ale pod nowo zalogowanym użytkownikiem.

Aktualizacja

Zrobiłem dużo prób i błędów. Prawdopodobnie ustawiłem$scope.devices do[] i przenosił zdarzenia logowania w każdej możliwej kombinacji. To, co ostatecznie zadziałało, to skrzypce @ hiattp w zaakceptowanej odpowiedzi.

questionAnswers(2)

yourAnswerToTheQuestion