2014-10-23 8 views
11

Mam kilka usług, które korzystają z usługi sieciowej i przechowują wiele wyników. Zwykle buforowanie oznacza przechowywanie w zmiennej usługi. Gdy użytkownik się wyloguje, dane powinny zostać wyczyszczone. Służby wygląda następująco (w wersji uproszczonej):Najlepsze praktyki dotyczące czyszczenia danych w usługach podczas wylogowywania w AngularJs

class DataService { 

    private data; 

    constructor($http) 
    { 
    $http.get(url).then((response) => 
     { 
      this.data = response.data; 
     }); 
    } 

}

Który jest maszynopis, ale postanawia coś takiego:

var DataService = (function() { 
    function DataService($http) { 
     var _this = this; 
     $http.get(url).then(function (response) { 
      _this.data = response.data; 
     }); 
    } 
    return DataService; 
})(); 

mogę usunąć dane za pomocą odpowiedź w dokumencie This Question Które jest wykonywane w następujący sposób:

$rootScope.on('logout',function(){ 
    this.data = []; 
}); 

Jest to jednak dużo kodu, gdy mamy wiele usług i kontrolerów. Wszyscy wiemy, że ten nowy facet doda nowe dane do usługi i zapomni dodać go do sekwencji wylogowania. To po prostu zła praktyka.

Podobnie, dane są przechowywane w $ scope w różnych częściach aplikacji i to również musi zostać wyczyszczone. Zakres jest raczej prosty, ponieważ konstruktorzy dla kontrolerów są ładowani podczas każdej wizyty strony, a następnie zastępują dane.

Jednym z proponowanych rozwiązań jest odświeżenie, jednak daje to straszne wrażenia użytkownika.

Jednym z rozwiązań może być uściślenie, że usługi nigdy nie zostały stworzone lub całkowicie przeładowane kątowo.

Jaki jest najlepszy sposób na zrobienie tego? Czy przechowywanie danych w zmiennych w usługach jest złe?

+1

Interesujące pytanie. Na pewno nie * wszystkie * twoich usług polegają na zalogowanym użytkowniku? Przydałby się tutaj TypeScript. Możesz zdefiniować interfejs, powiedz "ILoggedInUserService", który ujawnia metodę 'tearDown()'. Zmusiłoby to programistę do wdrożenia tej metody dla wszystkich odpowiednich usług. Możesz wtedy [wyliczyć] (http://stackoverflow.com/questions/19411502/angular-get-list-of-all-registered-services) i wykonać przy wylogowaniu – CodingIntrigue

+5

Mam do czynienia z nim przez nadawanie zdarzenia, a wszystkie odpowiednie służby czyszczą swoje dane, słuchając tego wydarzenia.Dzięki temu kod jest zgrabny, bez wzajemnych zależności. – harishr

Odpowiedz

9

Możesz utworzyć usługę odpowiedzialną za usunięcie wszystkich danych z innych usług. W takim przypadku wystarczy wywołać metodę "clear" tej usługi i zaimplementować indywidualne, jednoznaczne wywołania wewnątrz tego (tak więc zaimplementowane tylko raz).

Daje to również korzyści polegające na tym, że masz przegląd, które dane usług należy usuwać cały czas, ponieważ możesz mieć wyjątki w przyszłości.

Zobacz także tę odpowiedź w celach informacyjnych: Injecting a service into another service in angularJS

+0

Nadal musisz określić poszczególne dane, chyba że przechowujemy wszystkie dane usług w oddzielnym obiekcie dla każdej usługi. Usunięcie tego obiektu spowodowałoby jego usunięcie. – CodeTower

+0

@Kabahango, wymyśliłeś sposób obejścia tego bez konieczności określania każdej właściwości, którą chcesz zresetować? Czuję, że opcja przeładowania okna jest prawdopodobnie lepszym rozwiązaniem niż to. – m0g

+0

Niezupełnie. Jednak dobrym podejściem jest stworzenie "wzorca repozytorium", tak aby wszystkie dane w aplikacji były przechowywane w jednym lub kilku repozytoriach. Nie jest to obejście per se, ale jest to dobry wzorzec projektowy. – CodeTower

4

można użyć pełnego odświeżania strony:

$window.location.reload(); 

będzie ponownie uruchomić cały stan aplikacji

Innym rozwiązaniem mogłoby być do przechowywania wszystko przechowywania sesji i wtedy jasne, że w dzienniku zewnątrz:

sessionStorage.clear(); 
+6

Użycie '$ window.location.reload()' daje zły interfejs użytkownika IMO. Co najmniej nie znalazłem sprytnie niezawodny sposób, aby to zrobić, gdy użytkownik nie widzi załadowania strony, a następnie przeładowuje. – CodeTower

Powiązane problemy