【问题标题】:How to toggle dark mode in Angular如何在 Angular 中切换暗模式
【发布时间】:2020-05-31 16:13:47
【问题描述】:

当用户切换开关时,我试图切换暗模式,该开关位于标题组件中。见下图:

<nav class="navbar navbar-expand-lg navbar-light bg-light">
    <a class="navbar-brand" href="#">Navbar</a>
    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation">
      <span class="navbar-toggler-icon"></span>
    </button>
    <div class="collapse navbar-collapse" id="navbarNavAltMarkup">
      <div class="navbar-nav">
        <a class="nav-item nav-link active" href="/">Home <span class="sr-only">(current)</span></a>
        <a class="nav-item nav-link" href="/about">About</a>
        <a class="nav-item nav-link" href="/contact">Contact</a>
        <a class="nav-item nav-link" href="/resume">Resume</a>
      </div>
    </div>
    <div class="custom-control custom-switch">
        <input (change)="onChangeToggle()" type="checkbox" class="custom-control-input" id="toggleTheme">
        <label class="custom-control-label" for="toggleTheme">Dark Mode</label>
      </div>
  </nav>

我的头组件 ts 文件包含一个名为 setDark 的布尔值,它通过输出装饰器在事件发射器中触发:

// header.component.ts

import { Component, OnInit , Output, EventEmitter} from '@angular/core';

@Component({
  selector: 'app-header',
  templateUrl: './header.component.html',
  styleUrls: ['./header.component.css']
})
export class HeaderComponent implements OnInit {

  @Output() mode = new EventEmitter<boolean>();

  setDark = false;

  constructor() { }

  ngOnInit(): void {

  }

  onChangeToggle() {
    this.setDark = !this.setDark;
    this.mode.emit(this.setDark);
    console.log(this.setDark);
  }

}

然后在 app.comoonent.html 中接收布尔值

 <app-header (mode)="receiveMode($event)"></app-header>

  <router-outlet></router-outlet>



// app.component.ts


import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {

  setMode = false;

  receiveMode($event) {
    this.setMode = $event;
    console.log("MODEEEE", this.setMode);
  }



  title = 'about-me';
} 

我尝试将 div 包裹在 app-header 和 router-outlet 周围,如下所示:

<app-header (mode)="receiveMode($event)"></app-header>
<div class="darkTheme">
  <router-outlet></router-outlet>

并使用 ngClass:

<div [ngClass]="{
  darkTheme: setMode
}">
</div>

但它不起作用。在切换开关时,我确实检查了布尔值是否已登录到控制台。是的。

【问题讨论】:

    标签: css angular


    【解决方案1】:

    看看这个 stackblitz:https://stackblitz.com/edit/angular-rubaka?file=src/app/toolbar-multirow-example.html

    它在#container:ElementRef 上切换类“dark-theme”:

    &lt;div #container style="padding: 4rem;" class="mat-typography dark-theme"&gt;

    styles.scss 在第 28 行定义了两个不同的主题(默认主题)...

    // Include the default theme styles.
    @include angular-material-theme($candy-app-theme);
    

    在第 39 行(深色主题)...

    .dark-theme {
      @include angular-material-theme($dark-theme)
    };
    

    希望这会有所帮助。

    【讨论】:

    • 您好,感谢您的意见。这是使用棱角材料吗?
    • 是的。但是自定义方法上的策略应该是相同的。如您所见,您可能会创建一个“深色主题”类名,然后为更新的元素(如颜色等)添加 SCSS @include...
    • 你为什么不使用 [ngClass]? angular.io/api/common/NgClass
    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 2021-03-05
    • 2020-07-07
    • 1970-01-01
    • 2020-10-01
    • 2021-05-30
    • 2020-09-03
    • 2020-02-16
    相关资源
    最近更新 更多