2014-10-23 15 views
11

çıkışında hizmetlerde veri temizleme için en iyi yöntemler Bir web servisini kullanan ve çok sayıda sonucu önbelleğe alan çeşitli hizmetlerim var. Önbelleğe alma, hizmette bir değişkeni depolamak anlamına gelir. Bir kullanıcı oturumu kapatıldığında veriler temizlenmelidir. hizmetler aşağıdaki (basitleştirilmiş sürümü) gibi görünür:}AngularJs

class DataService { 

    private data; 

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

typescript olmakla böyle bir şey olarak çözümlenir

:

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

cevabı kullanarak verileri temizlemek olabilir This Question içinde aşağıdaki gibi bir şeyler yapıyor:

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

Ancak, birden fazla hizmet ve denetleyicimiz olduğunda bu çok koddur. Ve hepimiz biliyoruz ki bu yeni adam bir servise bazı yeni veriler ekleyecektir ve bunu çıkış sırasına eklemeyi unutmaktadır. Bu sadece kötü bir uygulamadır.

Benzer şekilde, veriler uygulamanın çeşitli bölümlerinde $ kapsamına depolanır ve bu da temizlenmelidir. Denetleyicilerin yapıcıları her sayfa ziyaretine yüklendiğinden ve verileri geçersiz kılacağından, kapsam oldukça basittir.

Tek bir çözüm, yenilemeyi sağlamaktır, ancak bu, korkunç kullanıcı deneyimleri sağlar. Bir çözüm, hizmetlerin hiçbir zaman oluşturulmadığına veya tamamen açılmayacağına inandırmak için bir çözüm olabilir.

Bunu yapmanın en iyi yolu nedir? Verileri hizmetlerdeki değişkenlerde saklamak kötü mü?

+1

İlginç bir soru:

Ayrıca referans için bu cevaba bakınız. Hizmetlerin kesinlikle * hepsi * giriş yapmış kullanıcılara güveniyor mu? TypeScript burada yararlı olabilir. Bir "tearDown()" yöntemini ortaya çıkaran "ILoggedInUserService" gibi bir arabirim tanımlayabilirsiniz. Bu, geliştiricinin tüm uygulanabilir hizmetler için bu yöntemi uygulamaya zorlayacaktır. Daha sonra [numaralandır] (http://stackoverflow.com/questions/19411502/angular-get-list-of-all-registered-services) ve – CodingIntrigue

+5

çıkış oturumunu çalıştırabilirsiniz. İlgili hizmetler bu olayı dinleyerek verilerini temizler.Bu kodları hiçbir bağımlılık olmadan temiz tutun. – harishr

cevap

9

Diğer servislerden gelen tüm verileri temizlemekten sorumlu olan bir hizmet oluşturabilirsiniz. Bu durumda, sadece bu servisin "clear" yöntemini çağırmanız ve bunun içindeki tek tek çağrıları uygulamak zorundasınız (böylece sadece bir kez uygulanır).

Bu, aynı zamanda, gelecekteki istisnalarınız olabileceğinden, hangi hizmet verilerinin sürekli olarak temizlenmesi gerektiğine dair genel bir bakış açınız olmasını da sağlar. Injecting a service into another service in angularJS

+0

Tüm servis verilerini her hizmet için ayrı bir nesnede saklamıyorsak, tek tek verileri belirtmeniz gerekir. Sonra bu nesneyi silmek onu temizlerdi. – CodeTower

+0

@Kabahango, sıfırlamak istediğiniz her özelliği belirtmek zorunda kalmadan, bunun etrafından dolaşmanın bir yolunu buldunuz mu? Pencere yeniden yükleme seçeneği gibi hissediyorum muhtemelen bundan daha iyi bir seçenek. – m0g

+0

Tam olarak değil. Ancak iyi bir yaklaşım, "Repository pattern" yapmaktır. Böylece, uygulamanızdaki tüm veriler bir veya daha fazla depoda saklanır. Bu, kendi başına bir çözüm değil, ancak iyi bir tasarım deseni. – CodeTower

4

bir tam sayfa yenileme kullanabilirsiniz:

$window.location.reload(); 

bu başvurunuzun

bütün devlet yeniden başlayacaktır başka bir çözüm günlüğüne dışarı oturum depolama her şeyi ve daha sonra net saklamak için olabilir:

sessionStorage.clear(); 
+6

'$ window.location.reload()' işlevinin kullanılması kötü kullanıcı deneyimi IMO'yu verir. En azından, kullanıcının sayfa yükünü görmediği ve daha sonra yeniden yüklendiği yerde yapmak için akıllıca ve güvenilir bir yol bulamadım. – CodeTower