Angular RxJs行为主题未正确更新

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Angular RxJs行为主题未正确更新相关的知识,希望对你有一定的参考价值。

我正在尝试从同级组件共享一个字符串值(从灯开关切换到导航栏)。我的问题是,当我从DataService发出新值时,属性themeColor没有得到更新。

这是我App.Component.html的结构:

<navbar></navbar>
<banner><light-switch></light-switch></banner>

我正在尝试使用DataService:

import {Injectable} from '@angular/core';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';

@Injectable()
export class DataService {

  private themeColor = new BehaviorSubject<string>("#f5f0f0");
  currentThemeColor = this.themeColor.asObservable();

  constructor() { }

  changeThemeColor(color: string) {
    this.themeColor.next(color)
  }

}

这是我的light-switch.component.ts:

import { Component, OnInit } from '@angular/core';
import {DataService} from "./../Services/DataService";

@Component({
  selector: 'light-switch',
  templateUrl: './light-switch.component.html',
  styleUrls: ['./light-switch.component.scss']
})
export class LightSwitchComponent implements OnInit {
  public currentTheme;
  public themeColor;

  constructor(private sanitization: DomSanitizer, private dataService: DataService) { 
    this.currentTheme = "dark";
    this.themeColor = "#f5f0f0";
  }

  ngOnInit() {
    this.dataService.currentThemeColor.subscribe(color =>{ this.themeColor = color});
  }

  changeToLight(){
    this.dataService.changeThemeColor("black");
  }
  changeToDark(){
    this.dataService.changeThemeColor("#f5f0f0");
  }
}

还有我的navbar.ts:

import { Component, OnInit } from '@angular/core';
import {DataService} from "./../Services/DataService";

@Component({
  selector: 'navbar',
  templateUrl: './navigation-bar.component.html',
  styleUrls: ['./navigation-bar.component.scss']
})
export class NavigationBar implements OnInit {
  private themeColor;
  constructor(private dataService: DataService) {
  }

  ngOnInit() {
    this.dataService.currentThemeColor.subscribe(color => {this.themeColor = color});
  }
}

NavigationBar.html:

<div class="navbar">
  <i class="fa fa-github bannerIcon" id="githubIcon" [style.color]='themeColor'></i>
  <i class="fa fa-linkedin bannerIcon" id="linkedInIcon" [style.color]='themeColor'></i>
</div>

Light-switch.html:

<div id="lightSwitch">
  <button class="btn btn-secondary switchBtn-on" (click)="changeToLight()">On</button>
  <button class="btn btn-secondary switchBtn-off">Off</button>
</div>

我的App.Module.ts中有DataService作为提供者。当ngOnInit在navbar.ts中运行时,它确实获得了我设置的默认值;当我在light-switch.ts中调用changeThemeColor()时,它确实进入了DataService.ts并更改了currentColor属性,但是再次,navbar.ts中的themeColor属性不会更新为该currentColor属性。我怀疑需要某种事件侦听器才能正确地将值从DataService获取到navbar,但我认为这就是我所订阅的。

答案

您的代码看起来基本上是正确的。

您的DataService是否可能没有正确注册,并且您没有获得单例?您的DataService的providers数组是否在模块中?还是组件?还是包含多个组件?

确保该服务仅在一个地方注册(添加到providers数组中。)>

另一答案

1-如果您的数据服务包含在其他模块中,例如:共享模块(已导入到您的App模块中),则尝试在App模块中移动该服务,以便所有组件都应共享该服务的一个实例,并且可以更新数据状态。

以上是关于Angular RxJs行为主题未正确更新的主要内容,如果未能解决你的问题,请参考以下文章

如何在Angular 2中创建RxJS主题?

我们可以直接在Angular 4组件中订阅RxJs主题吗?

角度服务中的 EventEmitter 或 RxJS 主题

Angular 不会导入显示错误的 Rxjs

RxJS:如何切换以在多个行为主题源之间切换

Angular 7 RxJs - HTTP 调用未在 ForkJoin 中完成