@ViewChild와 @ContentChild의 차이점은 무엇입니까?


답변:


256

Shadow DOMLight DOM 용어를 사용하여 귀하의 질문에 답변 드리겠습니다 (웹 구성 요소에서 왔으며 자세한 내용은 여기 참조 ). 일반적으로 :

  • 그림자 DOM은 - 정의 된 구성 요소의 내부 DOM이다 당신에 의해 (A와 구성 요소의 창조자 최종 사용자로부터) 숨겨. 예를 들면 다음과 같습니다.
@Component({
  selector: 'some-component',
  template: `
    <h1>I am Shadow DOM!</h1>
    <h2>Nice to meet you :)</h2>
    <ng-content></ng-content>
  `;
})
class SomeComponent { /* ... */ }
  • Light DOM- 구성 요소의 최종 사용자가 구성 요소에 제공하는 DOM입니다. 예를 들면 다음과 같습니다.
@Component({
  selector: 'another-component',
  directives: [SomeComponent],
  template: `
    <some-component>
      <h1>Hi! I am Light DOM!</h1>
      <h2>So happy to see you!</h2>
    </some-component>
  `
})
class AnotherComponent { /* ... */ }

따라서 귀하의 질문에 대한 답변은 매우 간단합니다.

의 차이 @ViewChildren와는 @ContentChildren@ViewChildren동안 그림자 DOM 요소에 대한보기 @ContentChildren빛 DOM에서 그들을 찾아보십시오.


10
Minko Gechew 의 블로그 항목 blog.mgechev.com/2016/01/23/… 가 더 의미가 있습니다. @ContentChildren은 컨텐츠 투영 (<ng-content> </ ng-content> 사이의 하위 항목)에 의해 삽입 된 하위 항목입니다. Minkos 블로그에서 : "다른 한편으로, 주어진 컴포넌트의 호스트 요소의 시작 태그와 닫는 태그 사이에 사용되는 요소를 * content children **이라고합니다." Angular2의 Shadow DOM 및 뷰 캡슐화는 blog.thoughtram.io/angular/2015/06/29/…에 설명되어 있습니다.
westor

4
나에게 그것은 @TemplateChildren(대신 @ViewChildren) 또는 @HostChildren(대신 ) 처럼 @ContentChildren훨씬 더 나은 이름이 될 것입니다. 이러한 상황에서 우리가 이야기하는 모든 것이 뷰 관련이며 wrt 바인딩도 컨텐츠 관련입니다.
superjos

35
@ViewChildren== 자신의 자녀; @ContentChildren== 다른 사람의 자녀
candidJ

107

이름에서 알 수로서, @ContentChild그리고 @ContentChildren쿼리는 내부에 기존의 지시 돌아갑니다 <ng-content></ng-content>반면,보기의 요소 @ViewChild@ViewChildren만 직접 뷰 템플릿에있는 요소를 살펴 봅니다.


따라서 뷰에 구성 요소가없는 경우 @ViewChild (ren)을 사용하십시오.이 경우 @ContentChild (ren)로 대체됩니까?
벤 탈리아도 로스

31

Angular Connect의이 비디오에는 ViewChildren, ViewChild, ContentChildren 및 ContentChild https://youtu.be/4YmnbGoh49U에 대한 훌륭한 정보가 있습니다.

@Component({
  template: `
    <my-widget>
      <comp-a/>
    </my-widget>
`
})
class App {}

@Component({
  selector: 'my-widget',
  template: `<comp-b/>`
})
class MyWidget {}

에서 my-widget의 관점 comp-a입니다 ContentChildcomp-b입니다 ViewChild. CompomentChildrenViewChildrenxChild는 단일 인스턴스를 반환하는 동안 반복자를 돌려줍니다.


이것이 더 나은 설명입니다. 감사합니다 :)
Javeed

명확하고 간단한 예를 들었지만 MyWidget의 템플릿이 맞아야 <comp-b><ng-content></ng-content></comp-b>합니까?
arjel

1

예를 들어, 하나의 홈 구성 요소와 하나의 하위 구성 요소와 내부 하위 구성 요소가 하나의 작은 하위 구성 요소가 있습니다.

<home>
     <child>
           <small-child><small-child>
     </child>
</home>

홈 컴포넌트의 템플릿에 직접 추가되므로 @viewChildren을 사용하여 홈 컴포넌트의 컨텍스트에서 모든 하위 요소를 가져올 수 있습니다. 그러나 액세스하려고 할 때<small-child> 자식 구성 요소의 컨텍스트에서 요소 자식 구성 요소 템플릿 내에 직접 추가되지 않으므로 해당 요소에 액세스 할 수 없습니다. 홈 컴포넌트별로 컨텐츠 프로젝션을 통해 하위 컴포넌트로 추가됩니다. 이것은 @contentChild가 들어오는 곳이며 @contentChild로 가져올 수 있습니다.

컨트롤러에서 요소 참조에 액세스하려고 할 때 차이가 발생합니다. @viewChild에 의해 컴포넌트 템플릿에 직접 추가 된 모든 요소에 액세스 할 수 있습니다. 그러나 @viewChild로 투영 된 요소 참조를 가져올 수 없습니다. 투영 된 요소에 액세스하려면 @contentChild를 사용해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.