Bod*_*ody 35 angular2-services angular
我正在尝试从服务变量(isSidebarVisible
)获取更新的值,该变量值由另一个组件(header
)通过click事件(toggleSidebar
)继续更新.
sidebar.service.ts
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';
@Injectable()
export class SidebarService {
isSidebarVisible: boolean;
sidebarVisibilityChange: Subject<boolean> = new Subject<boolean>();
constructor() {
this.isSidebarVisible = false;
}
toggleSidebarVisibilty() {
this.isSidebarVisible = !this.isSidebarVisible
this.sidebarVisibilityChange.next(this.isSidebarVisible);
}
}
Run Code Online (Sandbox Code Playgroud)
sidebar.component.ts
export class SidebarComponent implements OnInit {
asideVisible: boolean;
_asideSubscription: any;
constructor(private sidebarService: SidebarService) {
this.asideVisible = sidebarService.isSidebarVisible
this._asideSubscription = sidebarService.sidebarVisibilityChange.subscribe((value) => {
this.asideVisible = value
})
}
ngOnInit() {
}
}
Run Code Online (Sandbox Code Playgroud)
header.component.ts(更新服务变量的位置)
export class HeaderComponent implements OnInit {
isSidebarVisible: boolean;
_subscription: any;
constructor(private sidebarService: SidebarService) {
this._subscription = sidebarService.sidebarVisibilityChange.subscribe((value) => {
this.isSidebarVisible = value
})
}
toggleSidebar() {
this.sidebarService.toggleSidebarVisibilty()
}
ngOnInit() {
}
}
Run Code Online (Sandbox Code Playgroud)
我可以看到服务变量值在header.component.html
何时发生变化{{ isSidebarVisible }}
但是In sidebar.component.html
总是打印默认值并且从不收听更改.
请帮我解决这个问题.
Sas*_*sxa 57
将订阅移至服务,两个组件都可以访问此值.如果你只需要一次值,你可以直接使用它(就像我在sidebar.component中所做的那样); 如果您需要使用此值更新某些内容,则可以使用getter(header.component中的示例).
@Injectable()
export class SidebarService {
isSidebarVisible: boolean;
sidebarVisibilityChange: Subject<boolean> = new Subject<boolean>();
constructor() {
this.sidebarVisibilityChange.subscribe((value) => {
this.isSidebarVisible = value
});
}
toggleSidebarVisibility() {
this.sidebarVisibilityChange.next(!this.isSidebarVisible);
}
}
Run Code Online (Sandbox Code Playgroud)
export class SidebarComponent {
asideVisible: boolean;
constructor(private sidebarService: SidebarService) {
this.asideVisible = sidebarService.isSidebarVisible;
}
}
Run Code Online (Sandbox Code Playgroud)
export class HeaderComponent {
constructor(private sidebarService: SidebarService) { }
get isSidebarVisible(): boolean {
return this.sidebarService.isSidebarVisible;
}
toggleSidebar() {
this.sidebarService.toggleSidebarVisibility()
}
}
Run Code Online (Sandbox Code Playgroud)
您还可以在两个/两个组件中订阅主题并获取其中的值:
this.sidebarService.sidebarVisibilityChange.subscribe(value => {...});
Run Code Online (Sandbox Code Playgroud)
如果您想了解更多有关主题的信息,请查看此处.
归档时间: |
|
查看次数: |
41215 次 |
最近记录: |