2017-03-16 33 views
6

Son zamanlarda, kodu sadeleştirmek ve paylaşılan bir durumu korumak için mevcut angular2 uygulamasına ngrx deposunu ekledim. Ancak, bir bölüm hakkında kafam karıştı, ben durumumu bir kez sunucudan güncellerim ve koğuştan sonra sunucuyu kontrol etmeden sadece devlet üzerinde çalışıyorum. Öyleyse örneğin arka taraftaki bazı şeyler değiştiğinde ne olur? Her seferinde kontrol edeyim, o sayfaya giderim veya daha iyi bir yol var mı? Temel olarak, devlet verilerinizin sunucu verilerini göstermek için güncellendiğinden emin olmak için en iyi uygulamanın ne olduğunu bilmek isterim?Ngrx mağazam sunucu tarafında nasıl değişiklik algılar?

+0

[Server Gönderilen Olaylar] (https://en.wikipedia.org/wiki/Server-sent_events) –

cevap

4

NGRX Effects kullanmanız önerilir. NGRX Efektlerini Mağaza ile birlikte uyguladığınızda, herhangi bir HTTP yan etkisi Etkiler tarafından ele alınır, bu da verileri güncellemek için Mağazada bir Eylem kullanır. Bir Etki, Eylemi dinler ve bir yan etki (HTTP) gerçekleştirmek için Eylemin yükünü kullanır. Efekt bittiğinde, yeni bir yük ile yeni bir Eylem (başarı için bir Eylem veya başarısızlık için bir eylem) çağırır, böylece Mağazadaki verileri günceller. example in the Effects docs yılında

o Login için bir etkisi gösterilmektedir:

@Injectable() 
export class AuthEffects { 
    constructor(
    private http: Http, 
    private actions$: Actions 
) { } 

    @Effect() login$ = this.actions$ 
     // Listen for the 'LOGIN' action 
     .ofType('LOGIN') 
     // Map the payload into JSON to use as the request body 
     .map(action => JSON.stringify(action.payload)) 
     .switchMap(payload => this.http.post('/auth', payload) 
     // If successful, dispatch success action with result 
     .map(res => ({ type: 'LOGIN_SUCCESS', payload: res.json() })) 
     // If request fails, dispatch failed action 
     .catch(() => Observable.of({ type: 'LOGIN_FAILED' })) 
    ); 
} 

Bu örnekte, Giriş için Efekt LOGIN eylem için dinler. LOGIN eylemi oluştuğunda, eylemin yükünü kullanır ve bir HTTP POST gerçekleştirir. HTTP POST geri döndüğünde, ya yük için json yanıtıyla LOGIN_SUCCESS eylemini çağırır veya LOGIN_FAILED eylemini döndürür.

Bu şekilde, Mağazanız her zaman HTTP gibi herhangi bir yan etkide döngüde tutulur. Bir bileşen veritabanındaki bir kaydı güncellerse, Etki, bu verilere abone olan tüm bileşenlerin güncellenmiş verileri alması için Mağaza'ya bildirmelidir.

Bu yardımcı olur umarım.

+0

gibi sunucu bildirimleri hakkında konuşuyor musunuz? Ayrıntılı yanıt için teşekkürler Tyler. Ne demek istediğini kısmen anlıyorum. Henüz NGRX Efektleri açmamıştım. Ama şimdi yapacağım, bu muhtemelen endişelerimi çözecektir. Çok teşekkürler –

+0

Orada Efektleri olması gerekenden daha karmaşık hale getiren birçok örnek var. Esasen mevcut HTTP çağrılarınız, belirli Eylemler'i dinleyerek ve sonra yeni İşlemleri yeni yüklerle geri getirerek Etkiler olarak davranacak şekilde değiştirilebilir. Efektin dinleyeceği eylem (yukarıdaki örnekte LOGIN gibi), Efekt yeni bir eylem ile yeni bir eylemi çağırıncaya kadar değiştirilmemiş bir yükü hemen bileşenlere geri göndermeye ihtiyaç duyabilir. –

+3

Etkiler için güzel bir açıklama, ancak soruya cevap vermeyebilir? Q'yu anladığım: sunucudaki bir şey değişir (ör. Kullanıcı B, listemdeki bir Todo'yu tamamlar). Sunucu bunu nasıl geri gönderir (Serverside olayları, web soketleri, Mq ...) ve hangi kod parçası mağaza için eylemi tetikler? – stwissel

İlgili konular