Angular 2提供了@ViewChild、@ViewChildren、@ContentChild和@ContentChildren装饰器,用于查询组件的子元素。
@ViewChild
@ViewChildren
@ContentChild
@ContentChildren
前两个和后两个有什么区别?
顾名思义,@ContentChild和@ContentChildren查询将返回存在于视图的<ng-content></ng-content>元素中的指令,而@ViewChild和@ViewChildren只直接查看视图模板中的元素。
<ng-content></ng-content>
我将使用DOM的影子和光DOM术语来回答你的问题(它来自web组件,请参阅更多在这里)。一般来说:
@Component({ selector: 'some-component', template: ` <h1>I am Shadow DOM!</h1> <h2>Nice to meet you :)</h2> <ng-content></ng-content> `; }) class SomeComponent { /* ... */ }
@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在Shadow DOM中查找元素,而@ContentChildren在Light DOM中查找元素。
@Component({ template: ` <my-widget> <comp-a/> </my-widget> ` }) class App {} @Component({ selector: 'my-widget', template: `<comp-b/>` }) class MyWidget {}
从my-widget的角度来看,comp-a是ContentChild,而comp-b是ViewChild。CompomentChildren和ViewChildren返回一个可迭代对象,而xChild返回一个实例。
my-widget
comp-a
ContentChild
comp-b
ViewChild
CompomentChildren
ViewChildren
让我们举个例子,我们有一个家庭组件和一个子组件,在子组件内部有一个小的子组件。
<home> <child> <small-child><small-child> </child> </home>
<small-child>
只需将ViewChildren重命名为InternalChildren,将ContentChildren重命名为ExternalChildren