Подтвердить что ты не робот

Какова цель использования forRoot в NgModule?

Какова цель использования forRoot в NgModule?

Это то же самое, что и поставщики в AngularJS 1.x?

Как он играет значительную роль в ленивой загрузке?

ТИА.

4b9b3361

Ответ 1

Это связано с одиночками. Угловые сервисы загружаются на страницу 1 раз (singleton), и все ссылки указывают на этот 1 экземпляр.

Существует риск того, что ленивый загруженный модуль попытается создать второй экземпляр того, что должно быть одноточечным, а метод forRoot() - это способ обеспечить, чтобы модуль приложения/общий модуль и любой ленивый загруженный модуль использовали один экземпляр 1 (корневой экземпляр).

Больше информации скопировано из: Предоставить базовый модуль однопользовательских услуг в Angular 2

Наилучший подход - создать модуль с поставщиками. Имейте в виду, что если ваша служба находится в общем модуле, вы можете получить несколько экземпляров. Лучше всего тогда настроить модуль с Module.forRoot.

По соглашению статический метод forRoot одновременно обеспечивает и настраивает службы. Он принимает объект конфигурации службы и возвращает ModuleWithProviders.

Вызовите forRoot только в корневом прикладном модуле AppModule. Вызов его в любом другом модуле, особенно в ленивом загруженном модуле, противоречит намерению и может привести к ошибке выполнения.

Не забудьте импортировать результат; не добавляйте его в любой другой список @NgModule.

РЕДАКТИРОВАТЬ - НАЙДЕН НЕКОТОРЫЕ ДОПОЛНИТЕЛЬНЫЕ СВЕДЕНИЯ ОБ УГЛОВЫХ ДОКАХ В ОТНОШЕНИИ К ВОПРОСУ КОДА В КОММЕНТАРИИ.

Если модуль предоставляет как провайдеры, так и декларации (компоненты, директивы, каналы), то загрузка его в дочерний инжектор, такой как маршрут, дублирует экземпляры провайдера. Дублирование провайдеров может вызвать проблемы, поскольку они будут скрывать корневые экземпляры, которые, вероятно, должны быть одноточечными. По этой причине Angular предоставляет способ отделить поставщиков от модуля, чтобы тот же модуль можно было импортировать в корневой модуль с провайдерами и дочерними модулями без поставщиков.

Создайте статический метод forRoot() (по соглашению) в модуле. Поместите поставщиков в метод forRoot следующим образом. Чтобы сделать это более конкретным, рассмотрим пример RouterModule. RouterModule должен предоставить услугу маршрутизатора, а также директиву RouterOutlet. RouterModule должен быть импортирован корневым модулем приложения, чтобы приложение имело маршрутизатор, и приложение имеет по крайней мере один RouterOutlet. Он также должен быть импортирован отдельными компонентами маршрута, чтобы они могли размещать директивы RouterOutlet в их шаблоне для подпунктов.

Если у RouterModule не было forRoot(), то каждый компонент маршрута создавал экземпляр нового экземпляра Router, который разбивал бы приложение, поскольку может быть только один маршрутизатор. По этой причине RouterModule имеет объявление RouterOutlet, так что он доступен везде, но поставщик маршрутизатора находится только в forRoot(). В результате модуль корневого приложения импортирует RouterModule.forRoot(...) и получает маршрутизатор, тогда как все компоненты маршрутизации импортируют RouterModule, который не включает маршрутизатор.

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

Ответ 2

Из docs

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

Вы можете узнать больше о том, почему он используется here

Ответ 3

Существует два способа создания модуля маршрутизации:

RouterModule.forRoot(routes)

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

RouterModule.forChild(routes)

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

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

Когда мы импортируем модуль маршрутизации, созданный с помощью RouterModule.forRoot(), Angular будет создавать экземпляр службы маршрутизатора. Когда мы импортируем модуль маршрутизации, созданный с помощью RouterModule.forChild(), Angular не будет создавать экземпляр службы маршрутизатора.

Поэтому мы можем использовать RouterModule.forRoot() один раз и использовать RouterModule.forChild() несколько раз для дополнительных модулей маршрутизации.

Ответ 4

forRoot() будет использоваться для ввода провайдеров в верхней части приложения. Экземпляр компонента и директивы создается каждый раз при каждом вызове. Когда вы укажете то же самое в корне приложения (используя forRoot()), будет создан только один экземпляр.

Во-первых, нам нужно понять, что провайдерам вводят какую-то разницу, чем те компоненты, которые вводятся в директивы. Когда класс аннотируется с @Injectable, только один экземпляр этого класса будет создан по вызову и будет использоваться по всему приложению. Для этого нам нужно добавить этот метод (forRoot()), когда класс импортируется в NgModule.

Надеюсь, теперь вы поняли.