Как вы, наверное, знаете, когда мы добавляем службу в объявление @NgModule()
, это будет Синглтон. Это означает, что он будет жить, пока живет наше приложение. Например:
export class AdminService { data = Array(10000).fill(dummy); } @NgModule({ providers: [AdminService, AdminDataService] })
Я вижу много людей, чье первое желание - просто поместить все свои услуги в @NgModule()
объявления, не задумываясь о последствиях. Проблема в том, что:
Вы не освобождаете память
Хотя, наверное, тебе эта память больше не нужна. Давайте остановимся на секунду и подумаем, действительно ли нам нужен этот сервис, чтобы быть широким синглтоном приложения?
Например, в нашем приложении у нас есть раздел администратора, где нам нужно отобразить большой список данных, которые, конечно же, хранятся в памяти.
Нам не нужно, чтобы этот сервис был синглтоном. Нам не нужен слой кеширования, и никому из этой вкладки не нужны данные с него.
Единственная цель службы - обмен данными между дочерними компонентами и предоставление нескольких вспомогательных методов.
Итак, мы вставляем его в поставщиков компонентов и делаем его не-одиночным сервисом.
@Component({ selector: 'admin-tab', providers: [AdminService, AdminDataService] })
Преимущество заключается в том, что когда Angular уничтожает компонент, Angular также уничтожает службу и освобождает память, которая занята им.
Крюк OnDestroy
Многие разработчики этого не знают, но у не-одиночных сервисов также есть ngOnDestroy()
крючок жизненного цикла. Вы можете использовать его для чистки.
export class AdminService implements OnDestroy { ngOnDestroy() { // Clean subscriptions, intervals, etc } }
Также, если мы вызываем NgModuleRef.destroy()
или PlatformRef.destroy()
, то метод ngOnDestroy
одноэлементных провайдеров также будет выполнен. Спасибо Алексею Зуеву за комментарий.
Подпишитесь на меня в Medium или Twitter, чтобы узнать больше об Angular, Vue и JS!
👂🏻 И последнее, но не менее важное: слышали ли вы об аките?
Акита - это модель управления государством, которую мы разработали здесь, в Datorama. Он успешно используется в среде производства больших данных более семи месяцев, и мы постоянно добавляем в него функции.
Акита поощряет простоту. Он избавляет вас от хлопот по созданию шаблонного кода и предлагает мощные инструменты с умеренной кривой обучения, подходящие как для опытных, так и для неопытных разработчиков.
Я очень рекомендую это проверить.