慕容708150
2022-07-21 21:09:41
我正在嘗試制作一個有角度的彈出框。目前有兩個組件和一個指令。當我點擊我的按鈕時,我收到一條錯誤消息錯誤類型錯誤:無法讀取未定義的屬性“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() }}
1 回答

慕的地10843
TA貢獻1785條經驗 獲得超8個贊
用這里替換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 中的元素
添加回答
舉報
0/150
提交
取消