使用按钮单击更改两个组件的颜色

Posted

技术标签:

【中文标题】使用按钮单击更改两个组件的颜色【英文标题】:change color in two components using a button click 【发布时间】:2021-12-09 07:12:03 【问题描述】:

就像标题所说的那样。我在书籍组件中有一个按钮,当它单击书籍组件中的 div 颜色时,导航栏组件中的另一个 div 应该改变它的颜色。

- 这是书籍组件:

export class BooksComponent implements OnInit 

  status:boolean = true ;
  color:boolean ;

  constructor(private colorService:ShareColorService)  
  
  changeTheme()
    this.status = !this.status ;
   ;

  public send():void
    this.colorService.updateColor(this.status) ; 
  

  ngOnInit(): void 
  


这是将数据值从书籍传递到导航栏组件的服务代码:

export class ShareColorService 
  
  private notifs = new Subject<boolean>() ;
  
  constructor()  

  public getColor(): Observable<boolean>
    return this.notifs.asObservable() ; 
    

  public updateColor(color: boolean)
    this.notifs.next(color) ;
  

这是导航栏组件:

export class NavbarComponent implements OnInit 
  
  public navbarNewColor:boolean ;
  public subscription: Subscription ;
  constructor(private colorService:ShareColorService)  

  public ngOnDestroy(): void
    this.subscription.unsubscribe() ;
  

  public ngOnInit(): void 
    this.subscription = this.colorService.getColor().subscribe(color => this.navbarNewColor = color) ;
  console.log("navbarnewcolor :",this.navbarNewColor) ;
    

控制 ngclass 改变颜色的三元运算符:

<nav  class="navbar navbar-expand-lg navbar-light" [ngClass]="navbarNewColor ? 'bg-light':'bg-dark'">

【问题讨论】:

您是如何声明服务的? (确保只有一个实例)此外,我们也遇到了问题,但究竟什么不起作用? 当我单击按钮时,只有 div 的书籍组件的颜色会发生变化。其他组件没有任何反应 【参考方案1】:

您可以在此处使用更被动的方法,而不是通过订阅手动将值分配给 navbarNewColor 变量:

export class NavbarComponent 
  
  public navbarClass$ = this.colorService.getColor().pipe(
    map(isLightMode => isLightMode ? 'bg-light' : 'bg-dark')
  );

  constructor(private colorService:ShareColorService)  

<nav class="navbar navbar-expand-lg navbar-light" [ngClass]="(navbarClass$ | async)">

这应该会给你一个想法!

【讨论】:

我喜欢你的方法,但我的问题是要理解为什么它不起作用,而不是如何使它起作用,它仍然让我感到困惑 你的组件是否使用OnPush变更检测策略?此外,如果您可以添加一个最小可重现的沙箱,则更容易查明问题。 不,我正在使用 (click) 事件来检测任何更改。之后,一个变量将从 true 切换为 false,然后将此变量的值(状态:布尔值)发送到另一个组件。【参考方案2】:

终于找到答案了!

正如我所料,这很明显。通过发送按钮点击值(true 或 false)来更新div 颜色的服务方法只运行一次,因为它在点击按钮功能之外。

changeTheme()
    this.status = !this.status;
    this.colorService.updateColor(this.status); 
    console.log(this.status);

【讨论】:

以上是关于使用按钮单击更改两个组件的颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何在不更改颜色的情况下禁用 Vuetify 按钮

单击后按钮更改颜色 - 焦点无法正常工作

单击时暂时更改按钮的颜色

更改按钮的背景颜色

在 C# 中临时更改按钮单击时的按钮颜色

保存数据后更改按钮颜色