резольвер при ленивой загрузке angular

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

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
// services
import {SecondResolverService} from "./second.resolver.service";

const routes: Routes = [
  { path: 'first' , loadChildren: './first/first.module#FirstModule' },
  { path: 'second', loadChildren: './second/second.module#SecondModule' ,resolve : {data : SecondResolverService}}
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

person omer    schedule 17.11.2018    source источник
comment
Что вы делаете перед загрузкой модуля ленивой загрузки? Я реализовал такую ​​маршрутизацию, и она работает, когда навигация заканчивается, я получаю запрошенные данные.   -  person Octavio Garbarino    schedule 17.11.2018
comment
Вы используете разрешение в маршрутизации?   -  person omer    schedule 17.11.2018
comment
Да. Единственная разница в том, что я делаю это в дочернем модуле, а не в модуле приложения. Итак, у меня есть appmodule -> ChildOneModule -> ChildTwoModule, и в маршрутизации ChildOneModule у меня есть резолвер при разрешении пути к ChildTwoModule, и у меня есть данные во всех маршрутах ChildTwoModule... Разница только в том, что я не экспортируйте RouterModule, я просто импортирую его, как вы (в дочернем я использую forChild вместо forRoot, но это то же самое), и я импортирую в свой AppModule AppRoutingModule   -  person Octavio Garbarino    schedule 17.11.2018
comment
нет, не думай. вы можете добавить резолвер к энергичному маршруту непосредственно перед лениво загруженным маршрутом   -  person pixelbits    schedule 17.11.2018
comment
@pixelbits - не имеет смысла, если для Feature Module требуется резолвер, который является ленивым модулем, тогда почему резолвер должен быть объявлен в Eager Module.   -  person Sunil Singh    schedule 17.11.2018
comment
Так оно и есть   -  person pixelbits    schedule 17.11.2018
comment
@omer ты понял это?   -  person Dev    schedule 10.01.2019
comment
Да, я загрузил свое решение через несколько часов   -  person omer    schedule 10.01.2019
comment
Я не понял, у меня есть половина решения, поэтому я еще не опубликовал ..   -  person omer    schedule 15.05.2019


Ответы (2)


Документы Angular по отложенной загрузке

Этот конфиг всегда работает для меня. Если это не работает, возможно, что-то не так с вашим резольвером.

const routes: Routes = [
  {
    path: 'second',
    loadChildren: () => import('/second/second.module')
      .then(m => m.SecondModule),
    resolve: {
      data: SecondResolverService
    }
  },
person ejnickles    schedule 22.11.2019

Я столкнулся с той же проблемой. Вот пример этой проблемы на Stackblitz.com в Angular 9.

https://stackblitz.com/edit/angular-ivy-ubes1q?file=src%2Fapp%2Fapp.module.ts

ChildResolver установлен на маршруте с отложенной загрузкой, но никогда не вызывается.


Мой обходной путь состоял в том, чтобы сделать lazyResolver внутри моей защиты.

Итак, что-то вроде этого в data.guard.ts:

export class MyGuard implements CanActivate, CanActivateChild {

  constructor(
    private router: Router,
    private authService: AuthService,
    private myService: MyService,
  ) { }

  public canActivate(route, state): Observable<boolean | UrlTree> {
    return this.lazyResolver$().pipe(
      map(data => {
        // now we lazy resolved!
        return true;
      }),
      take(1),
      catchError(error => EMPTY),
    );
  }

  // safeguard when using resolvers and guards with lazy-loaded modules
  private lazyResolver$(): Observable<any> {
    return new MyResolver(this.myService).resolve(route, state),
  );

}

person user2599470    schedule 15.06.2020
comment
Ответы только по ссылке не рекомендуются при переполнении стека, поскольку они становятся бесполезными, если ссылка перестает работать или содержимое значительно изменяется. Вы должны отредактировать свой ответ, чтобы включить в него наиболее важные детали, относящиеся к вопросу. Ответы, которые представляют собой не более чем ссылку где-то еще, могут быть удалены. - person Hoppeduppeanut; 16.06.2020
comment
Обновлен мой комментарий с примером обходного пути. Спасибо. - person user2599470; 16.06.2020
comment
Для этого я создал проблему в github, возможно, другие в мире Angular могут пролить свет на эту проблему или не проблему. github.com/angular/angular/issues/37625 - person user2599470; 17.06.2020