Модуль триггера «Ленивая нагрузка» вручную 7 - PullRequest
0 голосов
/ 19 февраля 2019

Официальная документация содержит довольно много информации о том, как лениво загружать угловые модули. [ссылка здесь]

const routes: Routes = [
  {
    path: 'customers',
    loadChildren: './customers/customers.module#CustomersModule'
  },
  {
    path: 'orders',
    loadChildren: './orders/orders.module#OrdersModule'
  },
  {
    path: '',
    redirectTo: '',
    pathMatch: 'full'
  }
];

Это в основном делает загрузку модуля при посещении пользователями маршрутов /customers или /orders.

Однако я не могу понять, как загрузить модуль из другого модуля.

В моем приложении есть следующие модули:

  • auth
  • core
  • события
  • флэш-сообщения

Один маршрут моего auth module (страница профиля) должен использовать хранилище ngrx из events module.

Мой код выглядит следующим образом:

import { Observable } from 'rxjs';

import { Component, OnInit } from '@angular/core';
import { Store } from '@ngrx/store';

import { AppState } from '../../app.store';
import { IUser } from '../auth.api.service';
import { selectUser } from '../store/auth.selectors';
import { IEvent } from '../../events/events.api.service';
import { selectAllEvents, selectIsLoading } from '../../events/store/events.selectors';

@Component({
  selector: 'app-profile',
  templateUrl: './profile.component.html',
  styleUrls: ['./profile.component.scss'],
})
export class ProfileComponent implements OnInit {
  isLoading$: Observable<boolean>;
  events$: Observable<IEvent[]>;
  user$: Observable<IUser>;

  constructor(
    private store: Store<AppState>,
  ) {
    this.user$ = this.store.select(selectUser);
    this.isLoading$ = this.store.select(selectIsLoading);
    this.events$ = this.store.select(selectAllEvents);
  }

  ngOnInit() {
  }

}

Однако, как и следовало ожидать, этот код не работает. Поскольку ../../events еще не загружен. Как загрузить модуль вручную?Что-то вроде:

constructor(
  private store: Store<AppState>,
) {
  this.user$ = this.store.select(selectUser);
  this.loadModule('../../events/events.module.ts').then(() => {
    this.isLoading$ = this.store.select(selectIsLoading);
    this.events$ = this.store.select(selectAllEvents);  
  })
}

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Вам не нужно беспокоиться о загрузке ../../events.Поскольку у вас есть оператор импорта, класс / интерфейс будет доступен в модуле.Если по какой-либо причине вы хотите использовать функции других модулей, вы можете добавить имя модуля в массив imports в объявлении @NgModule.

0 голосов
/ 19 февраля 2019

Пакет Angular CLI объединяет модули на основе двух вещей:

1) Если у вас настроены модули для отложенной загрузки (loadChildren), он объединит модуль отдельно и предоставит егоlazily.

2) ОДНАКО, если есть какие-либо ссылки на лениво загруженный модуль в любом другом модуле (добавляя его в свой массив imports), он вместо этого связывает модуль со ссылочным компонентом.

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

У вас есть модуль, на который есть ссылка в массиве imports для модуля?содержащий компонент, который ссылается на него?

Какую ошибку вы получаете в точности?

Кстати - я расскажу об этом в части «отложенной загрузки» этого выступления: https://www.youtube.com/watch?v=LaIAHOSKHCQ&t=1120s

...