- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
app.component.ts
是我的 Angular 2 应用程序的入口点。它包含两个组件:标题和 sidenav .
@Component({
selector: 'app-root',
template: `
<app-header></app-header>
<app-sidenav></app-sidenav>
`
})
export class AppComponent { }
这是我想要实现的:在 <app-header>
中组件 我有一个(菜单)按钮,应该会触发 <app-sidenav>
的打开组件。
换句话说,<app-header>
中按钮的点击事件应该触发 open()
<app-sidenav>
中的方法组件。
header.component.ts:
@Component({
selector: 'app-header',
template: `
<button (click)="onSidenavOpen()">Menu</button>
`
})
export class HeaderComponent {
constructor() { }
onSidenavOpen() {
// trigger the opening of the <app-sidenav> component
}
}
sidebar.component.ts:
@Component({
selector: 'app-sidenav',
template: `
<md-sidenav #sidenav>
// bla bla, sidebar
</md-sidenav>
`
})
export class SidenavComponent {
constructor() { }
open(sidenav) {
sidenav.open();
}
close(sidenav) {
sidenav.close();
}
}
我读了component interaction section在 Angular 2 文档中,但我正在努力寻找在这两个组件之间进行通信的最佳方法。我的总体意图是为每个组件封装尽可能多的逻辑。
您将如何处理我的用例?你会创建一个中间服务吗?请分享一个例子。
最佳答案
您可以使用服务让两个独立的组件相互通信。在下面的示例中,HeaderComponent
使用 SidebarService
的 toggleSideNav
方法将值推送到公开的 Observable
。 SidenavComponent
在其初始加载时订阅此 Observable
并将响应被推送的新值。
边栏服务:
import { Injectable } from "@angular/core"
import { Observable, Subject } from "rxjs/Rx";
@Injectable()
export class SidebarService {
private sidenavOpenSubject : Subject<boolean>;
constructor() {
this.sidenavOpenSubject = new Subject<boolean>();
}
toggleSideNav(opening: boolean): void {
this.sidenavOpenSubject.next(opening);
}
onSideNavToggle(): Observable<boolean> {
return this.sidenavOpenSubject;
}
}
标题组件:
@Component({
selector: 'app-header',
template: `
<button (click)="onSidenavOpen()">Menu</button>
`
})
export class HeaderComponent {
constructor(private sidebarService: SidebarService) { }
onSidenavOpen() {
this.sidebarService.toggleSideNav(true);
}
}
侧边栏组件:
@Component({
selector: 'app-sidenav',
template: `
<md-sidenav #sidenav>
// bla bla, sidebar
</md-sidenav>
`
})
export class SidenavComponent implements OnInit {
constructor(private sidebarService: SidebarService) { }
ngOnInit(): void {
this.sidebarService.onSideNavToggle().subscribe(
(opening) => {
if (opening) {
//Logic to open the sidenav here
} else {
//Logic to close the sidenav here
}
}
);
}
open(sidenav) {
sidenav.open();
}
close(sidenav) {
sidenav.close();
}
}
SidebarService
需要在合适的模块中注册(例如您的 AppModule
)。
关于angular - 两个没有父子关系的组件如何通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42279084/
我正在使用 Gunicorn 为 Django 应用程序提供服务,它工作正常,直到我将其超时时间从 30 秒更改为 900000 秒,我不得不这样做,因为我有一个用例需要上传和处理一个巨大的文件(过程
我有一个带有非常基本的管道的Jenkinsfile,它可以旋转docker容器: pipeline { agent { dockerfile { args '-u root' } } stag
在学习 MEAN 堆栈的过程中,我遇到了一个问题。每当我尝试使用 Passport 验证方法时,它都不会返回任何响应。我总是收到“localhost没有发送任何数据。ERR_EMPTY_RESPONS
在当今的大多数企业堆栈中,数据库是我们存储所有秘密的地方。它是安全屋,是待命室,也是用于存储可能非常私密或极具价值的物品的集散地。对于依赖它的数据库管理员、程序员和DevOps团队来说,保护它免受所
是否可以创建像图片上那样的边框?只需使用 css 边框属性。最终结果将是没 Angular 盒子。我不想添加额外的 html 元素。我只想为每个 li 元素添加 css 边框信息。 假设这是一个 ul
我是一名优秀的程序员,十分优秀!