0

私は@ngrx/storeオブザーバブルとオブザーバブルを利用しています。ユーザーの JWT など、ユーザーに関する情報を設定するユーザー レデューサーがあります。

モデルをサブスクライブするルートにANavigationServiceが注入され、ユーザーのトークンの存在に基づいてルーティングされます。Aはローカル ストレージを読み取り、結果をレデューサーにディスパッチします。AppComponentuserUserServiceuser

問題は、ホームページにルーティングしようとすると、goToLogin()以下のエラーが表示されることです...あまり情報がありません。

ルート コンポーネントがまだ設定されていないと推測しています。アプリケーションがロードされるのを待ってからルーティングする方法はありますか? または、以下のエラーは別の問題を示していますか?

@Injectable()
export class NavigationService {
  private subscription: any;

  constructor(public router:Router, private userService: UserService) {
    this.subscription = this.userService.token$.subscribe(token => {
       if (token) {
         this.goToSecretStuff();
       } else {
         this.goToLogin();
       }
    });
  }


TypeError: Cannot read property 'constructor' of undefined
    at Object.implementsOnDestroy (pipe_lifecycle_reflector.ts:2)
    at Function.ChangeDetectionUtil.callPipeOnDestroy (change_detection_util.ts:209)
    at AbstractChangeDetector.ChangeDetector_CohortList_0.dehydrateDirectives (viewFactory_CohortList:91)
    at AbstractChangeDetector.dehydrate (abstract_change_detector.ts:177)
    at AbstractChangeDetector.destroyRecursive (abstract_change_detector.ts:200)
    at AbstractChangeDetector.destroyRecursive (abstract_change_detector.ts:207)
    at AbstractChangeDetector.destroyRecursive (abstract_change_detector.ts:207)
    at AppView.destroy (view.ts:159)
    at AppViewManager_.destroyViewInContainer (view_manager.ts:286)
    at ViewContainerRef_.remove (view_container_ref.ts:166)
    at ComponentRef_.dispose [as _dispose] (dynamic_component_loader.ts:283)
    at ComponentRef_.dispose (dynamic_component_loader.ts:87)
    at router_outlet.ts:108
    at e.run (zone-microtask.min.js:8)
    at e.run (ng_zone.ts:371)
    at zone-microtask.min.js:8
    at z (zone-microtask.min.js:8)
    at A (zone-microtask.min.js:8)
    at zone-microtask.min.js:8
    at zone-microtask.min.js:1
    at microtask (ng_zone.ts:410)
    at e.run (zone-microtask.min.js:8)
    at e.run (ng_zone.ts:371)
    at zone-microtask.min.js:8
    at MutationObserver.h (zone-microtask.min.js:8)
4

1 に答える 1

0

@nathasm がコメントで言及しているように、このような継ぎ目は既知のバグ#5169#6425です。

async回避策は、エラーがスローされた場合にルート コンポーネントのテンプレートからパイプを削除することです。

TypeError: 未定義のプロパティ 'constructor' を読み取れません

アップデート:

私はこれについてもっと調べてきましたが、パイプエラーを回避する方法を見つけることができませんでした ;( 独自の|asynxパイプを作成しようとしても。これを (そして最小限の変更で) 解決するために見つけた最良の方法は、サブスクライブしてconstructor()変更をトリガーすることですでの検出routerOnActivate()

  constructor(public store: Store<any>, private _cdref: ChangeDetectorRef) {
    // this.items$ = this.store.select('items');
    this.store.select('items')
      .subscribe(items => this.items = items);
  }
  routerOnActivate(next, prev) {
    this._cdref.markForCheck();
  }

私の特定のケースでは、ルートコンポーネントが既に何かを行う基本クラスを拡張するため、このボイラープレートのほとんどを取り除くことができますonActivate():

export class ItemListRoute extends _BaseRoute {
  public items: any;
  constructor(public store: Store<any>) {
    super(store);
    this.store.select('items')
      .subscribe(items => this.items = items);
  }
}
于 2016-02-20T05:27:37.107 に答える