2016-10-06 20 views
6

bir form bileşeni kapsamında Çalışma: Ben kullanıcı "bekleyen, başarı, hata, bozulmamış" formun durumlarını göstermeye çalışıyorumEğik 2 Ngrx Store, Etkileri ve "Geçici Devletleri"

. Bu devletleri mağazada "geçici devletler" olarak görmek istemiyorum.

Bir Etkisi vardır:

@Effect() 
    addTagToVideoEffect_ = this.appState_ 
    .ofType(TagActions.ADD_TAG_TO_VIDEO) 
    .map<AddTagToVideo>(action => action.payload) 
    .switchMap((addTag: AddTagToVideo) => this.dtsiVideosService.addTagToVideo(addTag) 
     .map((addTag: AddTagToVideo) => TagReducers.addTagToVideoComplete(addTag)) 
     .catch((err) =>Observable.throw(err)) 
    ); 

ve benim form bileşeninde ben TagActions.ADD_TAG_TO_VIDEO sevk ediyorum ve buna abone:

onTag(tag: TagEntity) { 

    this.subscription = this.tagActions.addTagToVideoEffect_.subscribe(
     this.onAddTagSuccess, 
     this.onAddTagError 
    ); 

    this.tagActions.addTagToVideo({videoId: this.videoId, tag: tag}); 
} 

.tagActions.addTagToVideoEffect_.subscribe sonuçlarını iki kez denilen benim etkiye sahip olmanın. Bütün bu geçici devletler için mağazadan geçmeksizin sonuçların etkilerini nasıl görebiliriz? Ve iki kez çağrılan etkiyi sahip değilsiniz ...

cevap

3

Etki çağrısını iki kez almanızın nedeni sadece bir Gözlemlenebilir olmasıdır. Bir Yayıncıya dönüştürmeniz gerekiyor.

@Effect() 
    addTagToVideoEffect_ = this.appState_ 
    .ofType(TagActions.ADD_TAG_TO_VIDEO) 
    .map<AddTagToVideo>(action => action.payload) 
    .switchMap((addTag: AddTagToVideo) => this.dtsiVideosService.addTagToVideo(addTag) 
     .map((addTag: AddTagToVideo) => TagReducers.addTagToVideoComplete(addTag)) 
     .catch((err) => Observable.throw(err)))) 
    .share(); 

Sonra görünümünde onunla çalışabilirsiniz:

tagFormState_: BehaviorSubject<FormState> = new BehaviorSubject<FormState>({}); 


    onTag(tag: TagEntity) { 

    Observable.from(this.tagActions2.addTagToVideoEffect_) 
    .first() 
    .toPromise() 
    .then(this.onAddTagSuccess, this.onAddTagError) 

    this.tagFormState_.next({pending: true}); 
    this.tagActions.addTagToVideo({videoId: this.videoId, tag: tag}); 
    } 


    onAddTagSuccess = (payload) => { 
    this.tagFormState_.next({success: 'Success !'}); 
    this.resetTagFormState(); 
    } 

    onAddTagError = (err) => { 
    this.tagFormState_.next({error: err.message}); 
    this.resetTagFormState(); 
    } 

    resetTagFormState() { 
    setTimeout(_=> { 
     this.tagFormState_.next({}); 
    }, 1000); 
    } 

Kaynakları yardımcı konuda bana bu sıralamak:

+0

Yani, ".publish(). RefCount()" ifadesinin tüm efektler için gerekli olduğunu söylüyorsunuz? Kural nedir? –

+0

Burada konu hakkında daha derin bir konuşma: https://github.com/ngrx/effects/issues/59 – Brett

+0

Görünümün etkinin geçici sonuçlarını göstermesi gerektiğinde bunu kullanıyorum ve bunları istemiyorum veya istemiyorum mağazada devlet. Ayrıca pek çok boilerplate Aksiyon Efektleri Reducers :) – Brett