[解決済み] 他のコンポーネントから更新されたときに、サービス変数の変更を検出するにはどうしたらいいですか?
2023-08-07 11:50:31
質問
サービス変数から更新された値を取得しようとしています(
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);
}
}
サイドバー.コンポーネント.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(サービス変数が更新される場所)
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() {
}
}
でサービス変数の値が変化しているのがわかります.
header.component.html
というときに
{{ isSidebarVisible }}
しかし
sidebar.component.html
では常にデフォルト値が表示され、変更に耳を傾けることはありません。
これを修正するのを助けてください。
どのように解決するのですか?
サブスクリプションをサービスに移動させ、両方のコンポーネントがこの値にアクセスできるようにします。もし値が一度だけ必要なら、直接それを使うことができます (私が サイドバー.コンポーネント でやったように); もしこの値で何かを更新する必要があるなら、ゲッターを使うことができます(例えば header.component ).
sidebar.service.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;
}
}
ヘッダーコンポーネント.ts
export class HeaderComponent {
constructor(private sidebarService: SidebarService) { }
get isSidebarVisible(): boolean {
return this.sidebarService.isSidebarVisible;
}
toggleSidebar() {
this.sidebarService.toggleSidebarVisibility()
}
}
また、どちらか/両方のコンポーネントでサブジェクトを購読し、そこで値を取得することも可能です。
this.sidebarService.sidebarVisibilityChange.subscribe(value => {...});
もし、Subjectsについてもっと知りたいのであれば をご覧ください。 .
関連
-
[解決済み] Angularで@Input()の値が変更されたときに検出する方法は?
-
[解決済み] コンポーネントテンプレートで要素を選択するには?
-
[解決済み】Angularでルート変更を検出する方法は?
-
[解決済み] ng buildの後にangular-cliのdist-folderのパスを変更するには?
-
[解決済み] プロパティ 'X' はプライベートであり、クラス 'xyzComponent' 内でのみアクセス可能です。
-
[解決済み] Angular2 bodyタグにクラスを追加する
-
[解決済み] AngularでFormGroupに動的にaddControlを追加する
-
[解決済み] 子ルートから親ルートに移動するにはどうしたらいいですか?
-
[解決済み] コンポーネントではなくクラスにサービスをインジェクトする方法
-
[解決済み] Angularで確認ダイアログを作る簡単な方法?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Angular Materialでのデフォルトのソート - ヘッダーのソート
-
[解決済み] 継承と依存性注入
-
[解決済み] AngularでFormArrayからすべての項目を削除する
-
[解決済み] AngularでFormGroupに動的にaddControlを追加する
-
[解決済み] プロパティ 'controls' がタイプ 'AbstractControl' に存在しない Angular 4 [duplicate] 。
-
[解決済み] Angular2ルートでAngularの方法でパラメータを取得するには?
-
[解決済み] 角度換算2
-
[解決済み] aria-valuenow' は 'div' の既知のプロパティではないため、バインドできません。
-
[解決済み] angular 4 ユニットテストエラー `TypeError: ctor is not a constructor`.
-
[解決済み] Angular6でパスワードの検証を確認する [重複]。