AngularJS'de güncel bir kullanıcı bağlamını nasıl saklayabilirim?


92

Bir kullanıcıda oturum açan bir AuthService'im var, bir kullanıcı json nesnesini geri döndürüyor. Yapmak istediğim, o nesneyi ayarlamak ve tüm değişikliklerin sayfayı yenilemeye gerek kalmadan uygulama genelinde (oturum açıldı / oturumu kapatıldı durumu) yansıtılması.

Bunu AngularJS ile nasıl başarabilirim?

Yanıtlar:


180

Bunu başarmanın en kolay yolu bir hizmet kullanmaktır. Örneğin:

app.factory( 'AuthService', function() {
  var currentUser;

  return {
    login: function() { ... },
    logout: function() { ... },
    isLoggedIn: function() { ... },
    currentUser: function() { return currentUser; }
    ...
  };
});

Daha sonra buna herhangi bir kontrol cihazınızda başvurabilirsiniz. Aşağıdaki kod, hizmetten bir değerdeki değişiklikleri izler (belirtilen işlevi çağırarak) ve ardından değiştirilen değerleri kapsamla eşitler.

app.controller( 'MainCtrl', function( $scope, AuthService ) {
  $scope.$watch( AuthService.isLoggedIn, function ( isLoggedIn ) {
    $scope.isLoggedIn = isLoggedIn;
    $scope.currentUser = AuthService.currentUser();
  });
});

Ve sonra, tabii ki, bu bilgileri uygun gördüğünüz şekilde kullanabilirsiniz; örneğin direktiflerde, şablonlarda vb. Bunu menü denetleyicilerinizde tekrar edebilirsiniz (yapmanız gerekenlere göre özelleştirilmiş), vb. Hizmetteki durumu değiştirdiğinizde hepsi otomatik olarak güncellenecektir.

Daha spesifik olan her şey, uygulamanıza bağlıdır.

Bu yardımcı olur umarım!


28
@ChrisNicola Aslında, AngularJS'de tüm hizmetler tekildir. Dolayısıyla, hizmet ilk talep edildiğinde (yani bir kontrolör veya başka bir hizmet tarafından) oluşturulur ve sonraki tüm istekler aynı örneği döndürür.
Josh David Miller

2
Olabilir, ancak bir işlev olarak, bu bilgileri genel API'den ve özel API'ye nasıl depoladığımıza ilişkin dahili bilgileri kaldırabiliriz. Bu, daha sonra yeniden düzenlemeyi çok daha kolay hale getirir. Ancak işlev yine de bir boole döndürür .
Josh David Miller

7
Bu aptalca bir soru olabilir ... ama kullanıcı sayfayı yenilerse ne olur - giriş bilgileri kaybolur mu?
Tomba

10
@Tomba Bu iyi bir soru. :-) Nitekim bilgi yenileme sırasında kaybolur. Genellikle, bazı oturum bilgilerini bir çerezde saklamak istersiniz . Bu oturum bilgileri AuthService,. Bu sadece sayfa yenilemelerine değil, aynı zamanda yeni bir sekmede bir bağlantı açan birine yardımcı olur.
Josh David Miller

2
@PixMach Öğrenme eğrisi konusunda% 100 haklısınız. Sorunuz, birçok özel duruma bağlı olacak, ancak işte bazı genel modeller. Endişeleri ayırmaya devam edin: bir oturum açma başlatmaya ilişkin kullanıcı arayüzü, yetkilendirmenin kendisinden ayrıdır ve bu, söz konusu duruma bağlı olabilecek herhangi bir menüden ayrı olan yetkilendirme durumundan ayrıdır. Gezinme / menü genellikle en iyi şekilde tek bir denetleyici tarafından işlenir ve yuvalanmış durumlar (a la ui-router) ve yol çözümlemeleri, kimlik doğrulama denetimlerini KURU tutmanın iyi bir yoludur. Yazdıkların doğru.
Josh David Miller

5

Bir AuthService tipik olarak herkesin ilgisini çektiğinden Josh'un iyi yanıtını düzeltebilirim (örneğin, oturum açma görünümünden başka kimse, hiç kimse oturum açmazsa kaybolmalıdır), belki daha basit bir alternatif, $rootScope.$broadcast('loginStatusChanged', isLoggedIn);(1) kullanarak ilgilenen tarafları bilgilendirmek olabilir. ) (2), ilgili taraflar (denetleyiciler gibi) kullanarak dinleyecektir $scope.$on('loginStatusChanged', function (event, isLoggedIn) { $scope.isLoggedIn = isLoggedIn; }.

(1) $rootScopehizmetin bir argümanı olarak enjekte edilmek

(2) Muhtemel bir eşzamansız oturum açma işlemi durumunda, yayının bir $rootScope.$apply()işleve dahil ederek bazı şeyleri değiştireceğini Angular'a bildirmek isteyeceğinizi unutmayın .

Şimdi, kullanıcı bağlamını her / birçok denetleyicide tutmaktan bahsetmişken, hepsindeki oturum açma değişikliklerini dinlemekten memnun olmayabilirsiniz ve yalnızca en üstteki oturum açma denetleyicisinde dinlemeyi, ardından diğer oturum açma farkındalı denetleyicileri çocuk olarak eklemeyi tercih edebilirsiniz. bunun gömülü denetleyicileri. Bu şekilde, alt denetleyici, kullanıcı bağlamınız gibi devralınan üst $ kapsam özelliklerini görebilir.


4
Fabrika işlevinin yanlış açıklaması nedeniyle olumsuz oy verildi. Bu yanlış anlaşılma, siz cevabınızı göndermeden aylar önce bu yorumda zaten ele alınmıştı .
Rhys van der Waerden
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.