Angular 7: расширенный метод PreloadingStrategy, называемый бесконечным временем - PullRequest
1 голос
/ 07 марта 2019

У меня проблема с предварительной загрузкой моих модулей. В начале у меня есть только модуль установки, который был предварительно загружен. Но когда я изменил стратегию модуля безопасности, моя стратегия предварительной загрузки работает не так, как ожидалось. Это называется бесконечно.

Вот мой код

const appRoutes: Routes = [
 {path: '', redirectTo: 'login', pathMatch: 'full', canActivate: [AuthGuard]
},

  {path: 'login', component: LoginComponent},
  {path: 'home', component: WelcomeComponent, children: [
  {path: 'security',loadChildren: './modules/security/security.module#SecurityModule', data:{preload: true }},
    {path: 'setup',loadChildren: './modules/setup/setup.module#SetupModule', data: { preload: false }}
    ]}

  ];

Вот моя реализация PreloadingStrategy.

import { Injectable } from '@angular/core';
import { PreloadingStrategy, Route } from '@angular/router';
import { Observable, of } from 'rxjs';

@Injectable()
export class SelectivePreloadingStrategy implements PreloadingStrategy {
  preloadedModules: string[] = [];

  preload(route: Route, load: () => Observable<any>): Observable<any> {
        if (route.data && route.data['preload']) {
              this.preloadedModules.push(route.path);

          console.log('Preloaded: ' + route.path);

          return load();
    } else {
      return of(null);
    }
  }
}

Изображение непрерывно (399+) вызывает этот метод стратегии.

enter image description here

EDIT:

Вот мой код модуля безопасности:

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { SysCommonModule } from '../common/sys.common.module';

@NgModule({
  declarations: [

  ],
    entryComponents: [

    ],

  imports: [

    /**** Angular ******/
    CommonModule,
    FormsModule,
    ReactiveFormsModule,

    /**** Third Party Controls ******/



    /**** Custom ******/
    SysCommonModule


  ],
  providers: []
})
export class SecurityModule {}

Ответы [ 2 ]

1 голос
/ 08 марта 2019

@ xuemind вы правы.

Чтобы решить эту проблему, я должен добавить пустой модуль маршрутизатора безопасности в свой модуль безопасности. Поэтому для этой цели я создал новый файл SecurityRoutingModule

ПРИМЕЧАНИЕ. Я добавил этот файл для наших будущих требований, когда нам понадобится этот модуль маршрутизации безопасности. В противном случае вы просто добавляете RouterModule.forChild([]) в модуль.

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';

const routes: Routes = [
  {path: '', redirectTo: 'dummy', pathMatch: 'full'}

];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule]
})

export class SecurityRoutingModule { }

А затем добавить этот SecurityRoutingModule класс в SecurityModule

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { SysCommonModule } from '../common/sys.common.module';
import { SecurityRoutingModule } from './security-routing.module';

@NgModule({
  declarations: [

  ],
    entryComponents: [

    ],

  imports: [

    /**** Angular ******/
    CommonModule,
    FormsModule,
    ReactiveFormsModule,

    /**** Third Party Controls ******/



    /**** Custom ******/
    SysCommonModule,
    SecurityRoutingModule // <= Added Security Routing Module Here.


  ],
  providers: []
})
export class SecurityModule {}
1 голос
/ 07 марта 2019

Добавление пустого модуля маршрутизации позволяет остановить бесконечный цикл предварительной загрузки.Не знаю почему.это просто работает.

Я предполагаю, что логика предварительной загрузки требует настройки маршрутизатора модуля.Если конфигурация роутера пропущена, фреймворк будет работать как положено.Я думаю, что это должна быть ошибка или дефект фреймворка, он должен знать об этом и, по крайней мере, сообщать о предупреждении или сообщении об ошибке.

@NgModule({
  declarations: [],
  imports: [
    CommonModule,
    RouterModule.forChild([]) // <= add an empty router configuration.

  ]
})
export class SecurityModule { }
...