Angular 7: расширенный метод предварительной загрузки, вызываемый бесконечное время

#angular #rxjs #angular-routing

#angular #rxjs #angular-routing

Вопрос:

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

Вот мой код

 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 }}
    ]}

  ];
  

Вот моя реализация предварительной загрузки.

 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 amp;amp; route.data['preload']) {
              this.preloadedModules.push(route.path);

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

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

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

введите описание изображения здесь

Редактировать:

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

 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 {}
  

Комментарии:

1. Я предполагаю, что что-то произошло в вашем модуле безопасности. Может потребоваться больше кода этого модуля.

2. Я добавил код своего модуля безопасности. поскольку это новый модуль, объявления so пусты.

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

Ответ №1:

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

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

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

  ]
})
export class SecurityModule { }
  

Комментарии:

1. сообщите об этой проблеме команде angular на github.

Ответ №2:

@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 {}