Могу ли я использовать ловушки жизненного цикла в Angular Guards? - PullRequest
0 голосов
/ 06 февраля 2020

Я работаю над angular. В моем проекте действие по загрузке данных при загрузке первой страницы отправляется от сторожа. Мне нужно было изменить охрану, чтобы получить доступ к магазину. Я подписываюсь на магазин в конструкторе и получаю доступ к любым данным, которые я хочу. Где можно отписаться от магазина? Могу ли я использовать ngOnDestroy ??

Это мой код

import { Observable, Subject } from 'rxjs';
import { Store, Action, State } from '@ngrx/store';
import { Actions, Effect, ofType } from '@ngrx/effects';
import { Injectable } from '@angular/core';
import { Router, Resolve, ActivatedRouteSnapshot, CanActivate } from '@angular/router';
import * as UpdateStore from '../store';
import { SetEntityType, LoadEntityList1 } from '../store/actions/Update.actions';
import { takeUntil } from 'rxjs/operators';

@Injectable()
export class EntityListingGuard implements CanActivate {
  Framework: any;
  Status: any;
  Type: any;
  destroyStore$ = new Subject();

  constructor(
    private store: Store<UpdateStore.State>,
    private actions$: Actions,
    private router: Router
  ) {
    this.store.pipe(
      takeUntil(this.destroyStore$)
    ).subscribe((state) => {
      this.Framework = state.SelectedFilters['frameworksChecked'] ? state.SelectedFilters['frameworksChecked'] : [];
      this.Type = state.SelectedFilters['typeChecked'] ? state.SelectedFilters['typeChecked'] : [];
      this.Status = state.SelectedFilters['statusChecked'] ? state.SelectedFilters['statusChecked'] : [];
    });
  }

  canActivate(route: ActivatedRouteSnapshot): Observable<boolean> | Promise<boolean> | boolean {
    const entityType = route.params['entityType'];
    const releaseId = route.params['releaseId'];
    const noOfUpdates = route.params['noOfUpdates'];

    const payload = {
      'searchTerm': '', pageLimit: 50, 'entityType': entityType, 'releaseId': releaseId, noOfUpdates: noOfUpdates,
      'checkedJobFrameworks': this.Framework 'checkedJobStatus': this.Type 'checkedJobType': this.Type  
    };

    this.store.dispatch(SetEntityType({ entityType: entityType }));
    this.store.dispatch(LoadEntityList1({ payload: payload }));

    const responseOK = this.actions$.pipe(ofType(UpdateActions.LoadEntityList1Success));
    const responseERROR = this.actions$.pipe(ofType(UpdateActions.globalError));
    return Observable.race(responseOK, responseERROR).take(1)
      .map(action => {
        if (action['type'] === '[Layout] Global Error') {
          return false;
        } else {
          return true;
        }
      }).first();
  }
}

1 Ответ

0 голосов
/ 06 февраля 2020

Охранники не являются компонентами, поэтому у них нет крючков. Чтобы сделать это, нужно сразу же получить данные и отписаться, как вы сделали для race с take(1).

. Кроме того, при взгляде на ваш код возникает смешанная логика c с использованием редуктора после принимая состояние. Редукторы, предназначенные для уменьшения данных в хранилище . Пожалуйста, рассмотрите возможность более детального изучения паттерна Flux / Redux.

Второй «также», магазин асинхронный c, и ваша охрана может быть непредсказуемой - подумайте о том, чтобы взять то, что вам нужно внутри canActive и вернуть результат как наблюдаемый.

...