에러 백과

컴포넌트 ID 생성 충돌

Angular는 컴포넌트를 생성할 때 각 컴포넌트의 고유한 ID를 생성합니다. 셀렉터, 호스트 바인딩 수, 클래스 프로퍼티 이름, 뷰 쿼리와 콘텐츠 쿼리 등을 포함한 Angular 컴포넌트 메타데이터를 사용합니다. 두 컴포넌트의 메타데이터가 동일하면 ID 생성 충돌이 발생하며, 같은 셀렉터를 공유할 때 흔히 발생합니다.

Angular는 내부적으로 컴포넌트 ID를 다음 용도로 사용합니다.

컴포넌트 ID 충돌로 발생할 수 있는 문제를 피하려면 아래 설명대로 충돌을 해결하는 것이 권장됩니다.

컴포넌트 ID 충돌 예제

@Component({
  selector: 'my-component',
  template: 'complex-template',
})
class Some {}

@Component({
  selector: 'my-component',
  template: 'empty-template',
})
class SomeMocked {}

이 두 컴포넌트를 정의하면 ID 생성 충돌이 발생하며 개발 중에 경고가 표시됩니다.

오류 디버깅

경고 메시지에는 ID가 충돌하는 두 컴포넌트의 클래스 이름이 표시됩니다.

다음 방법 중 하나로 문제를 해결할 수 있습니다.

  1. 두 컴포넌트 중 하나의 셀렉터를 변경하세요. 예를 들어 다른 태그 이름과 :not()처럼 실제 선택 결과에 영향을 주지 않는 의사 셀렉터를 사용할 수 있습니다.

    @Component({
      selector: 'my-component:not(p)',
      template: 'empty-template',
    })
    class SomeMocked {}
  2. 컴포넌트 중 하나에 호스트 속성을 추가하세요.

    @Component({
      selector: 'my-component',
      template: 'complex-template',
      host: {'some-binding': 'some-value'},
    })
    class Some {}