2015-09-20 10 views
7

Z tego, co przeczytałem w Angular 2 documentation z QueryList, @Query, powinno umożliwić możliwość wstrzyknięcia odniesienia do komponentu potomnego do danego komponentu.Angular 2.0 - Jaka jest różnica między @ViewQuery a @Query

Korzystanie @QueryView udało mi się uzyskać odwołanie do dziecka elementu DOM tak:

// Parent component's template 
<my-component #test> 

// Parent component 
class ParentComponent { 
    constructor(@Query('test') child: QueryList<any>) {...} 
} 

Spodziewałem się, że @Query może zwrócić element pasujący zamiast elementu DOM, ale nie udało aby to działało, ani nie znalazłem żadnej dokumentacji, która by to wskazywała.

Jaka jest różnica między tymi dwoma dekoratorów?

+0

'@ ViewQuery' odpytuje Zobacz DOM (widok, który zdefiniowanych w szablonie, alias Cień DOM) i' @ zapytaniami Query' dla DOM światła, gdy jest stosowany w dyrektywie (zobacz ten [problem] (https : //github.com/angular/angular/issues/1935)). Należy pamiętać, że w następnym wydaniu, alfa38, nazwa użytkownika i kwerendy zostaną zmienione (patrz [# 3922] (https://github.com/angular/angular/issues/3922)). –

+0

Eric, co masz na myśli mówiąc "lekki DOM"? Czy istnieje sposób na uzyskanie odniesienia do komponentów potomnych, tak aby można było wywoływać jego metody? Dzięki za ostrzeżenie dotyczące alpha38! – jaker

+0

Dostałem "lekki DOM" stąd [O cieniu DOM] (https://www.polymer-project.org/0.5/platform/shadow-dom.html). Oto przykład, jak to zrobić: [plnkr] (http://plnkr.co/edit/WGupqC?p=preview), patrz komentarz w nim. –

Odpowiedz

12

Po pierwsze, musisz zrozumieć, jakie są światła i cienia DOM DOM. Te terminologie pochodzą z komponentów sieciowych. Tak więc here is the link. Ogólnie:

  • Światło DOM - jest DOM że użytkownik końcowy swojego zaopatrzenia komponent do swojego urządzenia.
  • Cień DOM - jest wewnętrzną DOM swojego składnika, który jest zdefiniowany przez Ciebie (jako twórcy komponentu) i ukryte przed użytkownikiem końcowym.

myślę, patrząc na następnym przykładzie można łatwo zrozumieć, co jest co (here is the plunker):

@Component({ 
    selector: 'some-component' 
}) 
@View({ 
    template: ` 
    <h1>I am Shadow DOM!</h1> 
    <h2>Nice to meet you :)</h2> 
    <ng-content></ng-content> 
    `; 
}) 
class SomeComponent { /* ... */ } 

@Component({ 
    selector: 'another-component' 
}) 
@View({ 
    directives: [SomeComponent], 
    template: ` 
    <some-component> 
     <h1>Hi! I am Light DOM!</h1> 
     <h2>So happy to see you!</h2> 
    </some-component> 
    ` 
}) 
class AnotherComponent { /* ... */ } 

Więc odpowiedź dla ciebie pytanie jest dość prosta:

różnica między Query i ViewQuery że Query poszukuje elementów w świetle DOM podczas ViewQuery szuka dla nich w cieniu DOM.

PS Przykład pokazuje proste projekcje treści. Ale <ng-content> może robić o wiele bardziej skomplikowane rzeczy. Zobacz this issue.

+2

'@ Query' i' @ ViewQuery' są przestarzałe, zamiast nich należy używać '@ ContentChildren' i' @ ViewChildren'. –

+0

@ GünterZöchbauer możesz podać nam link, do którego są one oznaczone jako przestarzałe? Dziękuję Ci. – yttrium

+2

https://github.com/angular/angular/blob/master/modules/angular2/src/core/metadata.dart#L162, https://github.com/angular/angular/blob/master/modules/angular2 /src/core/metadata.dart#L137 –

Powiązane problemy