Эффект или услуга подписки в магазине Pure ngrx?

У меня есть приложение Angular 4, использующее ngrx. Текущий принципал является частью магазина. Каждый раз, когда изменяется принципал (обычно вход в систему или выход из системы, но позже может появиться какая-то функция «переключения пользователя»), я хотел бы обновить внешний вид приложения. У меня уже есть код, который добавит глобальный стиль CSS, а также заменит логотип.

Часть, в которой я не уверен: должно ли это быть реализовано как эффект ngrx, как услуга или что-то еще?

store.select( 'principal' ).subscribe(( state ) => {
    this.updateCorporateIdentity( state );
} );

В настоящее время у меня есть это в CorporateIdentityService, но я не доволен тем фактом, что мне нужно где-то внедрить службу, чтобы ее создать. Внедрение его в app.component приводит к ошибке lint

Property 'corporateIdentityService' is declared but never used.

что я считаю оправданным. Другой программист наткнется на эту неиспользуемую службу и удалит ее. Эффекты ngrx, afaik, реагируют на действие и производят новое действие. Мой код не будет производить новое действие.

Как это реализовать с помощью Angular?

Спасибо


person Simon    schedule 11.02.2018    source источник
comment
Эффекты предназначены для выполнения некоторой логики после отправки действия, поэтому я бы сделал это внутри эффекта. Имея это в эффекте, очень ясно, что после отправки действия X выполняется логика Y.   -  person LLai    schedule 12.02.2018
comment
Если вы помещаете состояние представления в ngrx, я бы предложил поместить вашу логику в эффект, который обновит представление через ngrx. Если это не подходит (не уверены, что вы меняете), вы можете использовать APP_INITIALIZER для начальной загрузки своей службы вместо того, чтобы вводить ее в свой app.component.   -  person bygrace    schedule 12.02.2018


Ответы (1)


Спасибо за комментарии, я пойду с эффектом ngrx:

export class PrincipalEffects {

    @Effect()
    updateCorporateIdentityOnPrincipalChange$: Observable<Action> = this.actions$
        .ofType( PrincipalActions.SET_PRINCIPAL )
        .flatMap(( action: ActionWithPayload<Principal> ) => {
            return this.corporateIdentityService.updateCorporateIdentity( action.payload );
        } )
        .map(( accountCode: string ) => this.principalActions.corporateIdentityUpdated( accountCode ) );

    constructor(
        private actions$: Actions,
        private corporateIdentityService: CorporateIdentityService,
        private principalActions: PrincipalActions ) { }

}
person Simon    schedule 13.02.2018