我试图从服务变量(isSidebarVisible)中获取更新值,该服务变量(isSidebarVisible)由另一个组件(header)使用点击事件(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);
    }
}

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() {
    }
}

header.component.ts (Where service variable is updated)

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() {

    }
}

{{ isSidebarVisible }}时,我可以看到服务变量值在header.component.html中发生变化,但在sidebar.component.html中,它总是打印默认值,并且从不听取这些变化.

请帮我修一下这个.

推荐答案

将订阅移动到服务,两个组件都可以访问此值.如果你只需要一次值,你可以直接使用它(就像我在sidebar.component年做的那样);如果需要用这个值更新某些内容,可以使用getter(header.component中的示例).

侧边栏.服务ts:

@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);
    }
}

侧边栏.组成部分ts

export class SidebarComponent {
    asideVisible: boolean;

    constructor(private sidebarService: SidebarService) {
        this.asideVisible = sidebarService.isSidebarVisible;
    }
}

header.component.ts

export class HeaderComponent {
    constructor(private sidebarService: SidebarService) { }

    get isSidebarVisible(): boolean {
        return this.sidebarService.isSidebarVisible;
    }

    toggleSidebar() {
        this.sidebarService.toggleSidebarVisibility()
    }
}

您还可以在任一/两个组件中订阅主题,并在那里获取值:

this.sidebarService.sidebarVisibilityChange.subscribe(value => {...});

如果你想了解更多关于科目的信息,看一下here.

Angular相关问答推荐

Angular 信号不更新afterNextender()

第15角Cookie的单元测试用例

Swiper 11角17 SSR Swiper断点不工作

更改物料设计中的复选框勾选 colored颜色

在Angular 为17的独立零部件中使用@NGX-平移

Component RegisterComponent模板出现Angular 错误

使用Dragula时,ReactiveForm元素在拖动副本中显示不同的