angular - 视图完全加载后如何从另一个组件调用方法?
问题描述
我在“标题组件”中使用来自 Angular Material 的 MatMenu。我只需要在某些条件下打开菜单。然而这个方法只在 ngAfterViewInit() 中起作用,在视图被加载之后。
export class HeaderComponent implements AfterViewInit {
@ViewChild('triggerCart') trigger: MatMenuTrigger;
ngAfterViewInit() {
this.openMenu();
}
openMenu() {
this.trigger.openMenu();
}
}
<button mat-button
[matMenuTriggerFor]="shoppingCartMenu"
#triggerCart="matMenuTrigger"
(menuOpened)="isOpened($event)"
(mouseenter)="largeScreen ? triggerCart.openMenu() : ''">
</button>
我需要从另一个组件调用此方法,但菜单触发器在 ngAfterViewInit 之外未定义。
<button mat-stroked-button
(click)="someMethod()">
</button>
export class ProductDetailComponent {
@ViewChild(HeaderComponent) header: HeaderComponent;
someMethod() {
this.header.openMenu();
}
}
加载 Header 组件后,如何实现组件之间的通信?
解决方案
这是一个方法示例(但不一定是最好的方法)。这是为了让人们了解组件之间的交互。
产品组成
export class ProductComponent {
clickBehavior = new BehaviorSubject(null);
click() {
this.clickBehavior.next(1);
}
}
产品标记
<my-header [openMenu]="clickBehavior"></my-header>
<div>
<button (click)="click()">Click</button>
</div>
标头组件
export class HeaderComponent implements AfterViewInit {
@ViewChild('trigger') trigger: MatMenuTrigger;
@Input() openMenu: Observable<any>;
ngAfterViewInit() {
this.openMenu.subscribe(value => {
if (value) {
this.trigger.openMenu();
}
});
}
}
标题标记
<button mat-button
[matMenuTriggerFor]="menu"
#trigger="matMenuTrigger">Menu</button>
<mat-menu #menu="matMenu">
<button mat-menu-item>Item 1</button>
<button mat-menu-item>Item 2</button>
</mat-menu>
这个想法是触发 Header 组件的 Input,这是使用 Product 组件中的 BehaviorSubject 完成的。
参考:
推荐阅读
- javascript - 如何在 jquery 的每个链接后添加“br”?
- mysql - SQL 查询根据客户使用过的唯一商户数量对客户进行排名
- sql-server - SQL Server管理系统中如何查看所有列的数据类型
- javascript - 我应该在谷歌翻译 api 请求正文中输入什么参数?
- node.js - 如何在前端 REACT.JS 中捕获来自某个远程 URL(www.example.com)或某个服务器的 JSON 数据
- node.js - 在线存储 JSON 文件的最简单方法?
- excel - 使用 Sum 产品的公式计算重叠日期数组中的总小时数
- android - Android Webview net::ERR_UNKNOWN_URL_SCHEME 错误到 Play Store
- linux - 无法使用 SSH 连接 AWS EC2 实例
- javascript - 如何通过 JavaScript/JQuery 更改选定的 DropDownList 项目?