8

level0level1およびという 3 つのネストされたコンポーネントがありlevel2、次のように定義されています。

@Component({
selector: 'level2',
template: `<div>I am level 2</div>`,
})
export class Level2 {
  getName(){
    return "my name is 'TWO'";
  }
}

@Component({
selector: 'level1',
template: `<div>I am level 1<level2></level2></div>`,
directives: [Level2]
})
export class Level1 {
  getName(){
    return "my name is 'ONE'";
  }
}

@Component({
selector: 'level0',
template: `<div>I am level 0<level1></level1></div>`,
directives: [Level1,Level2]
})
export class App {
@ViewChild(Level1) level1:Level1;
@ViewChild(Level2) level2:Level2;
ngAfterViewInit() {
  if(this.level1){var name1 = this.level1.getName();}
  if(this.level2){var name2 = this.level2.getName();}
  console.log("name1",name1);
  console.log("name2",name2);
  }
}

コンソールでは、次のように表示されると予想していました。

name1 my name is 'ONE'
name2 my name is 'TWO'

しかし、代わりに次のように表示されます。

name1 my name is 'ONE'
name2 undefined

私は何が欠けていますか?コンポーネントがを介してLevel0アクセスできないのはなぜですか?Level2@ViewChild

のメソッドにアクセスするLevel2方法はありLevel0ますか?


ここにplnkrがあります

4

2 に答える 2

3

これは現時点では不可能だと思います。

ViewQueryMetadata API docには、次のように記載されています。

子孫を除いて、QueryMetadata と同じクエリ パラメータをサポートします。

QueryMetadata API docには、次の子孫の例があります。

クエリが直接の子を検索するか、クエリを実行する要素のすべての子孫を検索するかを、descendants パラメーターを使用して構成します。デフォルトでは false に設定されています。

...ここのコードは表示されていません...

項目を照会すると、最初のコンテナーにはデフォルトで a と b しか表示されませんが、Query(TextDirective, {descendants: true})c も表示されます。

于 2016-04-15T19:29:56.127 に答える