【发布时间】:2017-11-26 02:23:44
【问题描述】:
我想为用户提供一个按钮来改变整个网站的主题。我对所有内容都使用引导程序“.scss”文件。 这是我所做的:
我在“src/styles”文件夹中有“dark-styles.scss”和“light-styles.scss”。这两个文件都覆盖了我需要覆盖的类和方法,并且还从“node-module”导入了“bootstrap.scss”作为默认值。当我通过“.angular-cli.json”向应用程序提供任何这些文件时,如下所示;它完美地工作。
"styles": [
"../node_modules/font-awesome/css/font-awesome.css",
"../node_modules/@swimlane/ngx-datatable/release/index.css",
"../node_modules/@swimlane/ngx-datatable/release/assets/icons.css",
"../src/styles/dark-styles.scss"
],
或者,
"styles": [
"../node_modules/font-awesome/css/font-awesome.css",
"../node_modules/@swimlane/ngx-datatable/release/index.css",
"../node_modules/@swimlane/ngx-datatable/release/assets/icons.css",
"../src/styles/light-styles.scss"
],
如果我提供黑暗,主题就是黑暗,如果我提供光明,主题就是光明。
但我想要实现的是动态地允许用户更改主题。因此,基于stackoverflow中的其他答案;我访问了我的应用程序组件中的“文档”,这也是我的根组件。它使我可以访问整个 html 页面,其中我有一个可以从 app-component 设置的链接标签。
HTML 文件
<head>
<link id="theme" type="text/scss" rel="stylesheet" src="">
</head>
<body>
content .....
</body>
Angular-cli.json
"styles": [
"../node_modules/font-awesome/css/font-awesome.css",
"../node_modules/@swimlane/ngx-datatable/release/index.css",
"../node_modules/@swimlane/ngx-datatable/release/assets/icons.css"
],
应用组件:
import { Component, OnInit, Inject } from '@angular/core';
import { DOCUMENT } from '@angular/platform-browser';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
})
export class AppComponent implements OnInit {
currentTheme: string;
constructor( @Inject(DOCUMENT) private document) {
}
ngOnInit() {
this.currentTheme = 'dark';
this.document.getElementById('theme').href = '../styles/dark-styles.scss';
}
handelChangeTheme(event) {
if (this.currentTheme === 'dark') {
this.document.getElementById('theme').href = '../styles/light-styles.scss';
this.currentTheme = 'light';
console.log('light');
} else {
this.document.getElementById('theme').href = '../styles/dark-styles.scss';
this.currentTheme = 'dark';
console.log('dark');
}
}
}
在触发事件“handleChangeTheme”时,html 文件中#theme 的 href 更改。但它不会更新或应用样式。我知道它与 WebPack 以及它编译 scss 文件的方式有关。有没有人遇到过类似的情况或知道这个问题的解决方案。谢谢
【问题讨论】:
-
我猜你必须编译两个 scss 文件并让它们可供应用程序选择(即将它们打包到你的 webapp 中)
-
@ochi ...也尝试过...没有用。这样做时,将应用默认引导程序,覆盖全部被拒绝。
-
你解决了吗?我被指派做同样的事情。任何帮助将不胜感激
-
不,我暂时把它放在一边......在材料中实现这一点很容易
-
Webpack 使用处理器来转换 Sass -> CSS。假设路径和文件类型正确,这似乎与 Material doc 使用的技术相同(右上角的油漆桶,选择主题更新 href 为
link.style-manager-theme:material.angular.io)
标签: twitter-bootstrap angular webpack sass angular-cli