Man*_*ube 8 typescript angular2-directives viewchild angular
我有三个嵌套组件,称为level0,level1并且level2,定义如下:
@Component({
selector: 'level2',
template: `<div>I am level 2</div>`,
})
export class Level2 {
getName(){
return "my name is 'TWO'";
}
}
Run Code Online (Sandbox Code Playgroud)
@Component({
selector: 'level1',
template: `<div>I am level 1<level2></level2></div>`,
directives: [Level2]
})
export class Level1 {
getName(){
return "my name is 'ONE'";
}
}
Run Code Online (Sandbox Code Playgroud)
@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);
}
}
Run Code Online (Sandbox Code Playgroud)
在控制台中,我希望看到:
name1 my name is 'ONE'
name2 my name is 'TWO'
Run Code Online (Sandbox Code Playgroud)
但我明白了:
name1 my name is 'ONE'
name2 undefined
Run Code Online (Sandbox Code Playgroud)
我错过了什么?为什么不能Level0组件访问Level2过@ViewChild?
有没有办法访问Level2方法Level0?
小智 5
如果在嵌套组件的每个级别使用ViewChild,则可以实现此方法,如下所示:
// Level 2
@Component({
selector: 'level2',
template: `<div>I am level 2</div>`,
})
export class Level2 {
getName(){
return "my name is 'TWO'";
}
}
// Level 1
@Component({
selector: 'level1',
template: `<div>I am level 1<level2></level2></div>`,
directives: [Level2]
})
export class Level1 {
@ViewChild(Level2) level2:Level2;
getName(){
return "my name is 'ONE'";
}
// You need to add additional function that would be called from level 1
calledFromLevel1() {
return this.level2.getName();
}
}
// Level 0
@Component({
selector: 'level0',
template: `<div>I am level 0<level1></level1></div>`,
directives: [Level1,Level2]
})
export class App {
@ViewChild(Level1) level1:Level1;
ngAfterViewInit() {
if(this.level1) {
var name1 = this.level1.getName();
var name2 = this.level1.calledFromLevel1();
}
console.log("name1",name1);
console.log("name2",name2);
}
}
Run Code Online (Sandbox Code Playgroud)
我认为目前这是不可能的。
ViewQueryMetadata API 文档说明如下:
支持与 QueryMetadata 相同的查询参数,但descendants 除外。
QueryMetadata API 文档有以下后代示例:
使用descendants 参数配置查询是查找查询元素的直接子元素还是所有后代。默认设置为 false。
...此处未显示代码...
查询项目时,第一个容器默认只会看到 a 和 b,但
Query(TextDirective, {descendants: true})它也会看到 c。
| 归档时间: |
|
| 查看次数: |
5132 次 |
| 最近记录: |