programing

RouterModule.for 루트(ROUTES) vs RouterModule.어린이용(ROUTS)

bestprogram 2023. 5. 2. 23:04

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