Angular CLI에서 서비스를 생성 할 때 인젝터 블 데코레이터의 기본 값이 ‘root’인 ‘provided in’특성을 가진 메타 데이터가 추가됩니다.
@Injectable({
providedIn: 'root',
})
정확히 무엇을 제공합니까? 이것이 전체 응용 프로그램에 대해 ‘전역’유형의 싱글 톤 서비스처럼 서비스를 제공한다고 가정하고 있지만 AppModule의 공급자 배열에서 이러한 서비스를 선언하는 것이 더 깨끗하지 않습니까?
최신 정보:
다른 사람을 위해, 다음 단락은 특히 기능 모듈에만 서비스를 제공하려는 경우 이에 대한 또 다른 좋은 설명을 제공했습니다.
이제
@Injectable()
새providedIn
속성을 사용하여 데코레이터 내부에 공급자를 등록하는 새로운 권장 방법이 있습니다.'root'
응용 프로그램의 값 또는 모듈로 허용 됩니다. 당신이 사용하는 경우'root'
, 당신은injectable
응용 프로그램에서 싱글로 등록됩니다, 당신은 루트 모듈의 공급 업체에 추가 할 필요가 없습니다. 당신이 사용하는 경우 마찬가지로,
providedIn: UsersModule
의는injectable
의 공급자로 등록되어UsersModule
받는 사람을 추가하지 않고providers
모듈의 “-.
https://blog.ninja-squad.com/2018/05/04/what-is-new-angular -6 /
업데이트 2 :
추가 조사 후, 나는 그것을 가지고있는 것이 유용하다고 결정했습니다 providedIn: 'root'
provide
루트 모듈 이외의 다른 모듈에서 서비스 를 원한다면 providers
피처 모듈 데코레이터에서 배열을 사용하는 것이 좋습니다 . 그렇지 않으면 순환 종속성에 시달립니다. 흥미로운 토론이 여기에 있습니다-https: //github.com/angular/angular-cli/issues/10170
답변
providedIn을 사용하는 경우, 인젝터 블은 모듈의 제공자에 추가하지 않고 모듈의 제공자로 등록됩니다.
에서 Docs
서비스 자체는 CLI가 생성하고 @Injectable로 장식 된 클래스입니다. 기본적으로이 데코레이터는 providedIn 속성으로 구성되어 서비스 공급자를 만듭니다. 이 경우 providedIn : ‘root’는 서비스가 루트 인젝터에 제공되도록 지정합니다.
답변
providedIn: 'root'
Angular 6 이후로 서비스를 제공하는 가장 쉽고 효율적인 방법입니다.
- 이 서비스는 모듈의 공급자 배열 (예 : Angular <= 5)에 추가 할 필요없이 단일 응용 프로그램에서 단일 응용 프로그램으로 사용할 수 있습니다.
- 서비스가 지연로드 된 모듈 내에서만 사용되는 경우 해당 모듈과 함께 지연로드됩니다.
- 사용하지 않으면 빌드에 포함되지 않습니다 (트리 흔들림).
자세한 내용은 설명서 및 NgModule FAQ를 참조하십시오.
Btw :
- 응용 프로그램 전체의 싱글 톤을 원하지 않으면 공급자의 구성 요소 배열을 대신 사용하십시오.
- 다른 개발자가 특정 모듈 외부에서 서비스를 사용하지 않도록 범위를 제한하려면
providers
대신 NgModule 배열을 사용하십시오 .
답변
문서에서
주사 가능한 데코레이터 란 무엇입니까?
클래스를 인젝터에서 사용할 수있는 것으로 표시합니다.
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root',
})
export class UserService {
}
서비스 자체는 CLI가 생성 한 클래스이며 @Injectable ()로 장식되어 있습니다.
정확히 무엇을 제공합니까?
@NgModule 또는 다른 InjectorType과 연관 시키거나이 인젝터를 ‘루트’인젝터에 제공하도록 지정하여 인젝터를 제공 할 인젝터를 판별하십시오. 이는 대부분의 앱에서 애플리케이션 레벨 인젝터입니다.
providedIn: Type<any> | 'root' | null
제공 : ‘루트’
루트 수준에서 서비스를 제공하면 Angular는 하나의 공유 서비스 인스턴스를 생성하여이를 요청하는 모든 클래스에 주입합니다. 제공자를 @Injectable () 메타 데이터에 등록하면 Angular는 컴파일 된 앱에서 서비스를 사용하지 않는 경우 서비스를 제거하여 앱을 최적화 할 수 있습니다.
제공 : 모듈
특정 @NgModule에서 서비스를 제공하도록 지정할 수도 있습니다. 예를 들어, 생성 한 모듈을 가져 오지 않으면 응용 프로그램에서 서비스를 사용할 수 없게하려면 서비스를 모듈에 제공하도록 지정할 수 있습니다
import { Injectable } from '@angular/core';
import { UserModule } from './user.module';
@Injectable({
providedIn: UserModule,
})
export class UserService {
}
이 방법은 아무 것도 주입하지 않으면 서비스의 트리 쉐이킹 ( 트리 쉐이킹 은 코드 기반에서 사용되지 않는 코드를 제거하는 빌드 프로세스의 단계)을 가능하게하기 때문에 선호 됩니다.
어떤 모듈이 어떤 모듈을 제공해야하는지 서비스에서 지정할 수없는 경우, 모듈 내에서 서비스 제공자를 선언 할 수도 있습니다.
import { NgModule } from '@angular/core';
import { UserService } from './user.service';
@NgModule({
providers: [UserService],
})
export class UserModule {
}
답변
providedIn은 루트 인젝터가 서비스 인스턴스 작성을 담당 함을 Angular에 알려줍니다. 이러한 방식으로 제공되는 서비스는 전체 응용 프로그램에서 자동으로 사용할 수 있으며 모듈에 나열 할 필요가 없습니다.
서비스 클래스는 자체 공급자로 작동 할 수 있으므로 @Injectable 데코레이터에서이를 정의하는 것이 필요한 모든 등록 이유입니다.
답변
에 따르면 Documentation
:
제공자를 @Injectable () 메타 데이터에 등록하면 Angular는 컴파일 된 앱에서 서비스를 사용하지 않는 경우 서비스를 제거하여 앱을 최적화 할 수 있습니다.