RouterModule.for 루트(ROUTES) vs RouterModule.어린이용(ROUTS)
이 두 가지의 차이점은 무엇이며 각각의 사용 사례는 무엇입니까?
문서가 정확하게 도움이 되는 것은 아닙니다.
forRoot는 모든 지시어, 지정된 경로 및 라우터 서비스 자체를 포함하는 모듈을 만듭니다.
forChild는 모든 지시어와 지정된 경로를 포함하지만 라우터 서비스는 포함하지 않는 모듈을 만듭니다.
제 막연한 추측으로는 하나는 '메인' 모듈을 위한 것이고 다른 하나는 수입된 모듈을 위한 것입니다(메인 모듈에서 이미 서비스를 사용할 수 있기 때문에). 하지만 사용 사례가 생각나지 않습니다.
저는 이 기사를 읽는 것을 강력히 추천합니다.
공급자가 있는 모듈
모듈을 가져올 때 일반적으로 모듈 클래스에 대한 참조를 사용합니다.
@NgModule({
providers: [AService]
})
export class A {}
-----------------------------------
@NgModule({
imports: [A]
})
export class B
가 모듈에 되었습니다.A
루트 인젝터에 추가되어 전체 응용 프로그램에서 사용할 수 있습니다.
그러나 다음과 같은 공급자에 모듈을 등록하는 다른 방법이 있습니다.
@NgModule({
providers: [AService]
})
class A {}
export const moduleWithProviders = {
ngModule: A,
providers: [AService]
};
----------------------
@NgModule({
imports: [moduleWithProviders]
})
export class B
이것은 앞의 것과 같은 의미입니다.
로드가 느린 모듈에는 자체 인젝터가 있다는 것을 알고 있을 것입니다.그래서 당신이 등록하고 싶다고 가정해 보겠습니다.AService
할 수 일부는 사용할 수 없습니다.BService
느리게 로드된 모듈에만 사용할 수 있습니다.다음과 같이 모듈을 리팩터링할 수 있습니다.
@NgModule({
providers: [AService]
})
class A {}
export const moduleWithProvidersForRoot = {
ngModule: A,
providers: [AService]
};
export const moduleWithProvidersForChild = {
ngModule: A,
providers: [BService]
};
------------------------------------------
@NgModule({
imports: [moduleWithProvidersForRoot]
})
export class B
// lazy loaded module
@NgModule({
imports: [moduleWithProvidersForChild]
})
export class C
지금이다BService
하위 게으른 로드 모듈에만 사용할 수 있습니다.AService
전체 응용 프로그램에서 사용할 수 있습니다.
다음과 같이 위의 내용을 내보낸 모듈로 다시 작성할 수 있습니다.
@NgModule({
providers: [AService]
})
class A {
forRoot() {
return {
ngModule: A,
providers: [AService]
}
}
forChild() {
return {
ngModule: A,
providers: [BService]
}
}
}
--------------------------------------
@NgModule({
imports: [A.forRoot()]
})
export class B
// lazy loaded module
@NgModule({
imports: [A.forChild()]
})
export class C
##라우터 모듈과 어떤 관련이 있습니까?둘 다 동일한 토큰을 사용하여 액세스한다고 가정합니다.
export const moduleWithProvidersForRoot = {
ngModule: A,
providers: [{provide: token, useClass: AService}]
};
export const moduleWithProvidersForChild = {
ngModule: A,
providers: [{provide: token, useClass: BService}]
};
를 요청할 때 으로.token
게으르게 로드된 모듈에서 얻을 수 있습니다.BService
계획대로
은 " " 를 사용합니다.ROUTES
모듈과 관련된 모든 경로를 가져오는 토큰입니다.Lazy Loaded 모듈 관련 경로를 이 모듈 내에서 사용할 수 있기를 원하기 때문에(B 서비스와 유사함) Lazy Loaded Child Module에 대해 다른 구성을 사용합니다.
static forChild(routes: Routes): ModuleWithProviders {
return {
ngModule: RouterModule,
providers: [{provide: ROUTES, multi: true, useValue: routes}]
};
}
정답은 맞는 것 같은데 뭔가 빠진 것 같아요.
빠진 것은 "왜 그리고 무엇을 해결하는가?"입니다.
자, 시작하겠습니다.
먼저 몇 가지 정보를 언급하겠습니다.
모든 모듈은 루트 서비스에 액세스할 수 있습니다.
게으른 도 라서로느모에듈서제서다있에서 할 수 .app.module
.
로드가 느린 모듈이 앱 모듈이 이미 제공한 서비스를 자체적으로 제공하면 어떻게 됩니까? 두 가지 경우가 발생합니다.
그것은 문제가 되지 않지만 가끔은 문제가 됩니다.
어떻게 해결할 수 있을까요? 단순히 해당 공급자가 있는 모듈을 게으르게 로드된 모듈로 가져오지 마십시오.
이야기의 끝.
이 ^는 레이지 로드된 모듈이 레이지 로드되지 않은 모듈과 반대로 자체 분사 지점을 가지고 있다는 것을 보여주기 위한 것입니다.
그러나 공유(!) 모듈이 선언되면 어떻게 됩니까?providers
그리고 그 모듈은 게으른 사람에 의해 수입되고 그리고. app.module
다시 말씀드렸듯이, 두 가지 사례가 있습니다.
공유 모듈 POV에서 이 문제를 어떻게 해결할 수 있을까요?providers:[]
왜죠? 왜냐하면 그것들은 게으른 것과 app.module을 소비하는 것 모두에 자동으로 가져올 것이고 우리는 그것들을 원하지 않기 때문입니다. 우리는 각각 다른 인스턴스를 가질 것을 보았기 때문입니다.
음, 우가할 수 .providers:[]
하지만 여전히, 제공자들을 제공할 것입니다 (죄송합니다 :))
어떻게요? 이렇게요.
제공자가 없습니다.
그렇지만
이제 app.module이 POV 서비스를 사용하여 공유 모듈을 가져올 때 무슨 일이 발생합니까? 아무것도 발생하지 않습니다.
이제 게으른 모듈이 POV 서비스를 사용하여 공유 모듈을 가져올 때 어떤 일이 발생합니까? 아무것도 발생하지 않습니다.
컨벤션을 통해 수동 메커니즘 진입:
사진의 공급자는 다음과 같은 기능을 제공합니다.service1
그리고.service2
이것은 우리가 수입할 수 있게 해줍니다.service2
로드가 느린 모듈의 경우service1
모듈이 아닌 모듈의 경우.(기침...기침...기침)
그나저나, 아무도 당신이 전화하는 것을 막지 않습니다.forRoot
모듈 에서. 될 입니다. 하지만 당신은 2개의 인스턴스를 가질 것입니다. 왜냐하면app.module
또한 수행해야 합니다. 따라서 게으른 모듈에서는 수행하지 마십시오.
- if 또 - 약app.module
출들forRoot
(그리고 아무도 전화하지 않습니다.forchild
- . 에는 )만 있을 입니다. - 괜습니다찮다니▁). 하지만 루트 인젝터는service1
앱에서 )(사용 가능)
그럼 왜 우리는 그것이 필요할까요?제 생각엔:
공유 모듈을 통해 서로 다른 공급자를 분할하여 활성화된 모듈 및 유휴 모듈과 함께 사용할 수 있습니다.
forRoot
그리고.forChild
관습.반복합니다: 관례
바로 그겁니다.
잠깐!! 싱글톤에 대해 한마디도?그럼 왜 나는 모든 곳에서 싱글턴을 읽을까요?
음 - 위 문장에 숨겨져 있어요 ^
공유 모듈은 루트 및 하위를 통해 서로 다른 공급자를 분할하여 활성화된 모듈과 유휴 모듈과 함께 사용할 수 있습니다.
관례(!!)는 그것을 싱글톤으로 할 수 있도록 허용하고 있습니다. 또는 더 정확하게는 당신이 관례를 따르지 않는다면 당신은 싱글톤을 얻을 수 없을 것입니다.
그래서 당신이 로드만 한다면,forRoot
에 시대에app.module
그러면 당신은 오직 전화만 해야 하기 때문에 단 하나의 사례만 받습니다.forRoot
은 있것는에에.app.module
.
-이에서 BTW에 대해 수 .forChild
은 호출하지 않습니다.forRoot
싱글톤의 POV에서 안전합니다.
않는 . forChild에만 가 없습니다. 단지 루트를 호출할 필요가 없습니다. 분명히 로드될 것입니다.app.module
게으른 모듈에 대한 기능을 제공하지 않고, 싱글톤이어야 하는 새로운 서비스를 만들지 않고, 자체 서비스를 보유합니다.
은 이컨벤션은당좋게능줍니다력은을신에라고 불리는 좋은 .forChild
게으르게 로드된 모듈에 대한 서비스만 사용합니다.
다음은 루트 공급자가 양수를 산출하는 데모이고, 로드가 느린 모듈이 음수를 산출하는 데모입니다.
설명서에는 이러한 구별의 목적이 다음과 같이 명시되어 있습니다. https://angular.io/docs/ts/latest/guide/ngmodule.html#!#core-for-root
루트 응용 프로그램 모듈인 AppModule에서만 루트를 호출합니다.다른 모듈, 특히 로드가 느린 모듈에서 호출하는 것은 의도에 반하는 것이며 런타임 오류를 발생시킬 가능성이 높습니다.
다른 @NgModule 목록에 추가하지 말고 결과를 가져와야 합니다.
가 " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "forRoot
는 "자녀" 기능에 .forChild
애플리케이션 시작 시 로드할 필요가 없는 서브모듈과 게으르게 로드된 모듈에 매우 유용하며, @HarryNin이 말했듯이 새로운 서비스를 등록하는 대신 RouterService를 재사용하라는 지시를 받아 런타임 오류가 발생할 수 있습니다.
그forRoot
정적 방법:
RouterModule.forRoot(routes)
forRoot 정적 방법은 앱의 루트 라우팅 모듈을 구성하는 방법입니다.RouterModule.forRoot(routes)를 호출할 때 Angular에게 라우터 클래스의 인스턴스를 전체적으로 인스턴스화하도록 요청하는 것입니다.Angular가 모든 기능 모듈을 가져오기 위해 새 기본 AppModule을 생성하는 것과 마찬가지로 모든 하위 경로를 가져오기 위한 AppRouting Module도 제공합니다.
Angular CLI를 통해 생성한 새 앱에서 forRoot 메서드는 실제로 app-routing.module.ts 내부에서 이미 사용되고 있습니다.앱에서 forRoot 메서드를 한 번만 사용하려고 합니다.이 방법은 Angular에 후드 아래에 있는 Router 클래스의 인스턴스를 인스턴스화하도록 지시하고 앱에 라우터가 하나만 있을 수 있기 때문입니다.forRoot 정적 메서드는 싱글톤 클래스를 사용하도록 보장하는 패턴의 일부입니다.
하위 경로:
RouterModule.forChild(routes)
forChild 정적 메서드를 사용할 때는 기본적으로 Angular에 "앱에 이미 사용 가능한 라우터 인스턴스가 있으므로 해당 인스턴스에 모든 경로를 등록하십시오."라고 말합니다.forChild 메서드는 앱 전체에서 경로를 등록하기 위해 호출하는 메서드이며 사용자가 만든 라우팅 모듈인 자식 내부에서 사용합니다.
forChild 정적 메서드는 앱 내에서 문제를 분리할 수 있도록 하여 Angular 모듈 기능의 핵심 부분을 담당하기 때문에 유용합니다.
앱에서 사용자 설정을 위한 새 기능 모듈을 만들고자 하면 이 기능에 몇 가지 경로가 포함된다고 가정합니다.앱이 성장함에 따라 결국 유지할 수 없게 되는 이러한 경로를 앱 라우팅 모듈에 직접 추가하는 대신 forChild 방법을 사용하여 앱 내에서 문제를 분리할 수 있습니다.먼저 새 사용자 설정 라우팅 모듈을 만듭니다.
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { UserSettingsComponent } from './user-settings.component';
import { UserProfileComponent } from './user-profile/user-profile.component';
const routes: Routes = [
{
path: 'settings',
component: UserSettingsComponent,
children: [
{
path: 'profile',
component: UserProfileComponent
}
]
}
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class UserSettingsRoutingModule { }
위의 forChild 메서드를 사용합니다.forRoot 메서드를 이미 사용했으므로 이미 인스턴스화된 앱 라우터에 경로를 등록하기만 하면 됩니다.
이제 다음과 같은 사용자 설정 모듈을 만들어야 합니다.
import { NgModule, CommonModule } from '@angular/core';
import { UserSettingsRoutingModule } from './user-settings-routing.module';
@NgModule({
imports: [
CommonModule,
UserSettingsRoutingModule
],
// Configure the rest of your module here
})
export class UserSettingsModule { }
그리고 여기 있습니다!이제 이 사용자 설정 모듈을 루트인 AppModule로 가져오기만 하면 각 구성 요소를 가리키는 자식 경로가 앱 내에서 구성됩니다.
이 가이드가 루트 및 차일드에 대한 Angular Router 정적 방법이 앱 내에서 잘 구성된 경로를 만드는 데 어떻게 도움이 되는지 이해하는 데 도움이 되었기를 바랍니다.자세한 내용은 설명서를 참조하십시오.
만약 appRoutes에 사이트의 다양한 기능(admin crud, user crud, book crud)에 대한 경로가 포함되어 있고 우리가 그것들을 분리하기를 원한다면 우리는 그것을 간단히 할 수 있습니다.
imports: [
BrowserModule, HttpModule,
AppRoutingModule,
RouterModule.forRoot(categoriesRoutes),
RouterModule.forRoot(auteursRoutes),
],
경로의 경우:
const auteursRoutes:Routes=[
{path:'auteurs/ajouter',component:CreerAuteurComponent},
]
const categoriesRoutes: Routes = [
{path:'categories/consulter',component:ConsultercategoriesComponent},
{path:'categories/getsouscategoriesbyid/:id',component:GetsouscategoriesbyIDComponent},
{path:'categories/ajout',component:CreerCategorieComponent},
{path:'categories/:id',component:ModifiercategorieComponent},
{path:'souscategories/ajout/:id',component:AjoutersouscategorieComponent},
{path:'souscategories/lecture/:id1',component:SouscategoriesComponent},
{path:'souscategories/modifier/:id1',component:ModifiersupprimersouscategorieComponent},
{path:'uploadfile',component:UploadfileComponent},
{path:'categories',component:ConsultercategoriesComponent},
]
이를 이해하기 위해 라우터 모듈을 구현한 것으로 간주합니다.레이지 로드된 경로와 공통 경로는 별도로 처리해야 하며 레이지 로드를 지원합니다.
@NgModule({
declarations: [
],
exports: [],
})
export class RouteModule {
static forRoot(): ModuleWithProviders<RouteModule> {
return { ngModule: RouteModule, providers: [routerHistoryService,handleCommonRoutesService] };
}
static forChild(): ModuleWithProviders<RouteModule> {
return {
ngModule: RouteModule, providers: [handleChildRouterService]
};
}
}
root ->의 경우 공급자(서비스)와 함께 routerModule을 추가하므로 공통 각도 라우팅에 필요한 모든 서비스(예: routerHistoryService)가 앱 모듈(루트 모듈)의 루트 인젝터에 주입됩니다.
forchild ->는 제공자(서비스)가 있는 routerModule을 추가하지만, 공통 서비스(ex routerHistoryService)가 루트 인젝터에 이미 추가되었기 때문에, 게으르게 로드된 모듈에서, 우리는 그것들을 사용할 수 있을 것이고, 만약 우리가 그것을 추가한다면, 두 개의 인스턴스를 만들 것입니다.특히 어린이 경로를 처리하는 데 필요한 서비스가 있을 수 있습니다.그래서 그런 경우에 우리는 아이들을 위해 전화를 걸 때, 그들에게 제공할 수 있습니다(예: handleChildRouterService)
라우터 모듈이 루트 및 자식에 대해 구현되지 않은 경우 아래 시나리오를 고려합니다.
루트 인젝터 라우터에서 HistoryService 이전 경로는 "홈/지연 모듈"입니다.
그러나 새로운 이력 서비스가 있는 게으른 모듈에서 이전 경로는 null입니다.
뒤로 버튼을 클릭할 때 돌아갈 데이터가 없습니다.그래서 routerModule은 애플리케이션 전체에서 라우터 모듈이 단일 인스턴스만 갖도록 하기 위해 이 패턴을 따라 구현했습니다.
언급URL : https://stackoverflow.com/questions/40498081/routermodule-forrootroutes-vs-routermodule-forchildroutes
'programing' 카테고리의 다른 글
Cygwin에서 루트 사용자/sudo와 동등합니까? (0) | 2023.05.02 |
---|---|
잘못된 Swift 지원 - 파일이 일치하지 않습니다. (0) | 2023.05.02 |
'사용' 지시어는 C#에서 네임스페이스 내부에 있어야 합니까 아니면 외부에 있어야 합니까? (0) | 2023.05.02 |
여러 개의 키로 "구별"을 효율적으로 수행하는 방법은 무엇입니까? (0) | 2023.05.02 |
중첩된 딕트의 Python 데이터 클래스 (0) | 2023.05.02 |