Kątowa 2 zapewnia @ViewChild
, @ViewChildren
, @ContentChild
i @ContentChildren
dekoratorów dla zapytań elementów potomnych danego składnika.
Jaka jest różnica między dwoma pierwszymi a dwoma ostatnimi?
Kątowa 2 zapewnia @ViewChild
, @ViewChildren
, @ContentChild
i @ContentChildren
dekoratorów dla zapytań elementów potomnych danego składnika.
Jaka jest różnica między dwoma pierwszymi a dwoma ostatnimi?
Odpowiedzi:
Odpowiem na twoje pytanie za pomocą terminologii Shadow DOM i Light DOM (pochodzi ona z komponentów internetowych, więcej informacji tutaj ). Ogólnie:
@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 { /* ... */ }
Tak więc odpowiedź na twoje pytanie jest dość prosta:
Różnica między
@ViewChildren
i@ContentChildren
polega na tym, że@ViewChildren
szukają elementów w Shadow DOM, a@ContentChildren
szukają ich w Light DOM.
@TemplateChildren
(zamiast @ViewChildren
) lub @HostChildren
(zamiast @ContentChildren
) byłyby znacznie lepszymi nazwami, ponieważ w takim kontekście wszystko, o czym mówimy, jest związane z widokiem, a wiązanie wrt jest również związane z treścią.
@ViewChildren
== twoje własne dziecko; @ContentChildren
== czyjeś dziecko
Jak sama nazwa wskazuje, @ContentChild
i @ContentChildren
zapytań powróci dyrektyw istniejących wewnątrz <ng-content></ng-content>
elementu widoku, podczas gdy @ViewChild
i @ViewChildren
tylko patrzeć na te elementy, które na widok szablonu bezpośrednio.
Ten film wideo od Angular Connect zawiera doskonałe informacje o ViewChildren, ViewChild, ContentChildren i ContentChild https://youtu.be/4YmnbGoh49U
@Component({
template: `
<my-widget>
<comp-a/>
</my-widget>
`
})
class App {}
@Component({
selector: 'my-widget',
template: `<comp-b/>`
})
class MyWidget {}
Z my-widget
perspektywy comp-a
jest ContentChild
i comp-b
jest ViewChild
. CompomentChildren
i ViewChildren
zwracamy iterowalność, podczas gdy xChild zwraca pojedynczą instancję.
<comp-b><ng-content></ng-content></comp-b>
rację?
Weźmy przykład: Mamy jeden komponent domowy i jeden komponent potomny, a wewnątrz komponent potomny jeden mały komponent potomny.
<home>
<child>
<small-child><small-child>
</child>
</home>
Teraz możesz pobrać wszystkie elementy potomne w kontekście komponentu domowego za pomocą @viewChildren, ponieważ są one dodawane bezpośrednio w szablonie komponentu domowego. Jednak podczas próby uzyskania dostępu do <small-child>
elementu z kontekstu komponentu podrzędnego nie można uzyskać do niego dostępu, ponieważ nie jest on dodawany bezpośrednio w szablonie komponentu podrzędnego. Jest dodawany poprzez projekcję treści do komponentu potomnego według komponentu domowego. W tym miejscu pojawia się @contentChild i możesz go pobrać za pomocą @contentChild.
Różnica występuje, gdy próbujesz uzyskać dostęp do referencji elementów w kontrolerze. Możesz uzyskać dostęp do grab wszystkich elementów, które są bezpośrednio dodawane do szablonu komponentu przez @viewChild. Ale nie można pobrać odniesienia do rzutowanych elementów za pomocą @viewChild Aby uzyskać dostęp do rzutowanego elementu, należy użyć @contentChild.