javascript - 从模板中获取元素兄弟组件 ng-content
问题描述
我正在尝试制作一个有角度的弹出框。目前有两个组件和一个指令。
当我点击我的按钮时,我收到一条错误消息
错误类型错误:无法读取未定义的属性“openPopover”
如何从指令中获取对父级的引用,然后从该父级获取子级?
因此,点击路径如下所示:[open-popover] / <map-popover> / <map-popover-content>
app.component.html
<mat-popover>
<mat-popover-content>
<p>Hello World</p>
</mat-popover-content>
<button mat-flat-button open-popover color="primary">Add Debt</button>
</mat-popover>
popover.component.ts
@Component({
selector: 'mat-popover',
template: '<ng-content></ng-content>',
styleUrls: ['./popover.component.scss']
})
export class MatPopoverComponent {
@ViewChild(MatPopoverContentComponent)
public content: MatPopoverContentComponent
public open() {
this.content.openPopover()
}
}
内容.component.ts
@Component({
selector: 'mat-popover-content',
template: `<ng-template #popoverContent>
<ng-content></ng-content>
</ng-template>`,
styleUrls: ['./content.component.scss']
})
export class MatPopoverContentComponent {
@ViewChild('popoverContent')
public template: TemplateRef<any>
public constructor(public dialog: MatDialog) { }
openPopover(): void {
this.dialog.open(this.template, {
hasBackdrop: false
})
}
}
open.directive.ts
@Directive({
selector: '[open-popover]'
})
export class OpenPopoverDirective {
public constructor(@Host() private popover: MatPopoverComponent) { }
@HostListener('click')
public onClick() {
this.popover.open()
}
}
解决方案
用这里替换ContentChild
装饰器,它应该可以工作。ViewChild
@ViewChild(MatPopoverContentComponent)
解释
您应该区分 Light DOM 和 Shadow DOM:
零件
@Component({
selector: 'mat-popover',
template: `<ng-content></ng-content>`, <--- Shadow DOM
styleUrls: ['./popover.component.scss']
})
export class MatPopoverComponent {}
消费者
<mat-popover>
<!-- Light DOM starts -->
<mat-popover-content>
<p>Hello World</p>
</mat-popover-content>
<button mat-flat-button open-popover color="primary">Add Debt</button>
<!-- Light DOM ends-->
</mat-popover>
所以在 Angular 中,我们使用 ViewChild/ren 查询 Shadow DOM 中的元素,使用 ContentChild/ren 查询 Light DOM 中的元素
推荐阅读
- windows - 在 windows cmd 中的一行上写两个命令时,有没有办法分隔变量名?
- python-3.x - 使用 Python 请求抓取 ajax 网站
- ruby-on-rails - 在 Rouge 语法高亮中使用 ERB 块作为文字
- variables - 在 Dax 中添加静态表
- database - 无法从数据库表中获取消息。ErrorException say:count(): 参数必须是数组或者实现了Countable的对象
- apache-spark - 在 spark 2.3.2 中,调用 Dataset.count() 时出现 java.lang.ClassCastException
- excel - 从excel中的字符串中提取日期并复制到新行
- angular - 如何在不重新渲染整个页面的情况下更新 observable 的部分值?
- python - 从列表内的列表中的项目中删除字符
- rxandroidble - RxAndroidBle 多连接