Начиная с Angular 6, модули никогда не выгружаются.
Маршрутизатор в настоящее время не проверяет, был ли модуль уничтожен после его ленивой загрузки. Таким образом, даже если вы получите NgModuleRef и вызовете destroy вручную, маршрутизатор все равно будет считать, что он загружен. Так что не будет лениво загружать его во второй раз.
Маршрутизатор просто загружает модуль, но не управляет его жизненным циклом. Даже если бы вы могли уничтожить модуль, это не освободило бы много памяти. Модули с ленивой загрузкой управляются пакетами WebPack, загружаемыми с помощью SystemJS. После загрузки они остаются в памяти. Даже если Angular уничтожит экземпляр модуля, исходный код пакета все еще находится в кеше памяти SystemJS загруженных пакетов.
Эта проблема распространяется на библиотеки поставщиков. Если у вас есть лениво загруженный модуль, который использует стороннюю графическую библиотеку, такую как D3, то эта библиотека поставщика будет загружена, и вы не сможете ее выгрузить.
Если вам нужны провайдеры, которые существуют только для определенных маршрутов, вам следует использовать провайдеров представлений.
@Component({
...
viewProviders: [
LazyFeatureService
]
})
export class MyLazyComponent {}
Когда вы используете вышеупомянутый компонент в качестве компонента маршрутизатора, тогда служба LazyFeatureService
создается, когда модуль загружается отложенно, но когда компонент уничтожается, служба также уничтожается. В следующий раз, когда пользователь посетит ленивый маршрут, сервис будет создан снова.
Обновление:
Причина в том, что мне нужно сбросить конфигурацию общего сервиса. По сути, у меня есть определенные данные конфигурации для приложения, и мне нужно переопределить их для модуля с ленивой загрузкой, но вернуть их, когда пользователь не находится в модуле.
Этого можно добиться, используя обработчики canActivate
и canDeactivate
в маршруте.
В конфигурации маршрута для ленивого модуля создайте маршрут верхнего уровня для обработки активаций.
const routes: Routes = [
{
path: '',
canActivate: [ConfigActivator],
canDeactivate: [ConfigActivator],
children: [
// move the routes here
]
};
Затем вы можете определить активатор следующим образом.
@Injectable()
export class ConfigActivator implement CanActivate, CanDeactivate<any> {
public constructor(private config: MyConfigService) {
}
public canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
this.config.lazyModuleLoaded();
return true;
}
public canDeactivate(component: any, currentRoute: ActivatedRouteSnapshot, currentState: RouterStateSnapshot, nextState?: RouterStateSnapshot): boolean {
this.config.lazyModuleUnloaded();
return true;
}
}
Приведенное выше вызовет методы службы, чтобы сообщить ей, когда следует обновить конфигурацию в зависимости от изменения состояния маршрутизатора. Поскольку это маршрут верхнего уровня для ленивого модуля, он будет запущен только тогда, когда маршрут активирован и когда маршрут покидает этот путь.
person
Reactgular
schedule
29.08.2018
@NgModule
s только для@Directive
s/@Component
s. В любом случае он вообще не будет вызываться, поскольку ленивый модуль не уничтожается, когда вы уходите от него. Он остается доступным, что позволяет повторно посещать его маршруты без перезагрузки. Конструктор вызывается, потому что его обеспечивает JavaScript, но onDestroy — это хук фреймворка. Объясните, почему вы хотите это сделать. Я не вижу мотивации, но, скорее всего, это проблема XY. - person Aluan Haddad   schedule 29.08.2018