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.