2015-09-20 10 views
7

Angular 2 documentationQueryListの中から、@Queryは、子コンポーネントへの参照を特定のコンポーネントに挿入できるようにする必要があります。角度2.0 - @ViewQueryと@Queryの相違点

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

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

私は@Queryが一致するコンポーネントではなく、DOM要素を返すことが期待されるが、私は管理されていない:私はそうのような子DOM要素への参照を取得するために管理してきた@QueryViewを使用して

それを動作させるために、またそれを示すドキュメンテーションが見つかりませんでした。

これら二つのデコレータの違いは何ですか?

+0

'@ ViewQuery'は、View DOM(テンプレートで指定したビュー、別名Shadow DOM)を照会し、ライトDOMをディレクティブで使用するときに' @ Query'クエリを実行します(この[issue] ://github.com/angular/angular/issues/1935))。次のリリースでは、alpha38は、ViewQueryとクエリの両方の名前が変更されることに注意してください(参照[#3922](https://github.com/angular/angular/issues/3922))。 –

+0

エリック、「軽いDOM」はどういう意味ですか?あなたがそのメソッドを呼び出すことができるように、子コンポーネントへの参照を取得する方法はありますか? alpha38に関する警告をありがとう! – jaker

+0

私はここから '光DOM' を得た[についてシャドウDOM](https://www.polymer-project.org/0.5/platform/shadow-dom.html)。ここでは、それを行う方法の例です:[plnkr](http://plnkr.co/edit/WGupqC?p=preview)、その中のコメントを参照してください。 –

答えて

12

まず、あなたは光と影DOM DOMが何であるかを理解する必要があります。これらの用語はWebコンポーネントに由来しています。だからhere is the link。一般的には:

  • ライトDOM - DOMは、コンポーネントのコンポーネント供給のエンドユーザーということです。
  • シャドウDOMは - (コンポーネントクリエイターとして)あなたを定義し、エンドユーザーから隠されているコンポーネントの内部DOMです。私が思う

、あなたは簡単に(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 { /* ... */ } 

するので、あなたが質問の答えは非常に単純です:

QueryViewQueryの違いはViewQueryシャドウDOMでそれらを探している間にQueryはライトDOM内の要素を探しているということです。

PSこの例では、簡単なコンテンツ投影を示しています。しかし、<ng-content>ははるかに複雑なことをすることができます。 this issueを参照してください。

+2

'@ Query'と' @ViewQuery'は非推奨です。代わりに '@ ContentChildren'と' @ViewChildren'を使用してください。 –

+0

@GünterZöchbauerは、非推奨としてマークされている場所へのリンクを教えていただけますか?ありがとうございました。 – 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 –