html - 影响所有组件和模式的主题服务在 Angular 6+
问题描述
根据帖子通过标题组件中的按钮切换类,该按钮通过Angular 6+影响主应用程序组件
我创建了一个
theme
服务,通过在 中切换类,它适用于所有组件'dark-mode'
,app.component.html
直到我发现我的所有模态<ng-template let-modal>
都在 下<body>
,当然这些模态不起作用。所以我从这个答案转向另一个解决方案:stackoverflow.com/a/59123790/6630524
我试图注入
DOCUMENT
并Renderer2
进入header
组件,它工作正常。但是我现在看到该theme
服务已被弃用,所以我投入Renderer2
了该theme
服务(不再在header
组件中),它拒绝工作!
您能帮我保留theme
服务,并且仍然能够将主题应用于所有组件(以及这些模态)吗?
解决方案
结果很长一段时间没有人回答,所以我决定自己深入研究解决方案,见下文仅供参考。
首先,仍然通过放入(之前在组件中本地设置)继续使用该theme
服务:Renderer2
theme.service.ts
header
@Injectable({
providedIn: 'root'
})
export class ThemeService {
public isDarkMode: boolean;
private renderer: Renderer2;
constructor(
@Inject(DOCUMENT) private document: Document,
rendererFactory: RendererFactory2
) { this.renderer = rendererFactory.createRenderer(null, null);
}
public toggleDarkMode() {
this.isDarkMode = !this.isDarkMode;
if (this.isDarkMode) {
this.renderer.addClass(this.document.body, 'dark-mode');
} else {
this.renderer.removeClass(this.document.body, 'dark-mode');
}
}
}
其次,你需要在构造函数中设置一个公共变量,这里我选择构造函数header.component.ts
:
export class HeaderComponent implements OnInit {
/*
* Inject the theme service which will be called by our button (click).
* @param {ThemeService} themeService instance.
*/
constructor(public themeService: ThemeService) {}
ngOnInit() {}
}
然后在 中放置一个按钮header.component.html
来切换您的主题(注意:您可以将按钮放在项目中的任何位置,以及相应的公共变量中定义abc.component.ts
)
<button (click)="themeService.toggleDarkMode()"><i class="fa fa-moon"></i></button>
toggleDarkMode
现在,只要单击按钮,就会触发公共功能,然后当主题服务根据您定义的dark-mode
样式更新时,模式和其他组件将反映更改,例如:
#lucky.dark-mode {
color: #a2b9c8;
background-color: #01263f!important;
}
您可能需要将此应用于所有<body>
in index.html
:
<body id="lucky">
<app-root></app-root>
</body>
祝你好运,编码愉快!
推荐阅读
- db2 - 是否可以在 Merge 语句中实现循环并在每 6000 行中提交一次
- c# - WooCommerce webhook c# - 比较哈希
- ionic-framework - 在 appflow 中为 Web 进行生产构建
- vba - 在 word vba 中查找标题文本并选择下一个形状或内联形状
- java - 如何根据服务器端抛出的异常向客户端显示错误消息
- asp.net-mvc - 为什么交易不起作用?仅适用于第一个 .savechanges();
- ios - 将工作空间拆分为框架时如何处理扩展?
- javascript - 为什么 Applisten 在 sequelize 之前运行?
- c++ - 使用字符串变量作为文件路径从子目录获取文件 - C++
- javascript - JSON-LD 模式 NUXT