【发布时间】:2021-09-15 17:13:15
【问题描述】:
我正在尝试对单页应用程序进行动态样式表更改以在 Angular 中工作。这个想法是创建不同的主题,并让用户在专用菜单中选择它们。可能有很多主题,所以请不要介意下面的示例只有两个变体。功能已准备就绪。到目前为止,我已经将所有样式收集在单个大型 scss 文件中,每个主题一个。 (请注意,我很清楚,在 Angular 中,您经常为每个组件将样式拆分为许多子 scss 文件。但为了使这个想法奏效,我希望将它们全部放在每个主题的单个文件中)。我的菜单正常工作,并使用本地存储让应用记住选择了哪个主题,因为必须重新加载网站才能使更改生效。
现在解决问题: 在 app.component.ts 中,样式表以标准格式定义(即 styleUrls: [filename])。当在那里使用静态文件路径/名称时,以及使用在 @component-code 之外定义的变量时,样式可以完美运行。但是对于动态主题更改,我从 localstorage 中简单地获取了变量:
var settingsString = localStorage.getItem('usergraphicsdata');
if (isDefined(settingsString)) {
let myUserSettings = JSON.parse(settingsString);
const themename = myUserSettings.theme;
这一切也都在那里工作。不同的 console.logs 确认它理解了它应该理解的一切。但是问题来了。
if(themename == "theme1"){
var stylePath = "./app.component_theme1.scss";
var graphicFolder = '/assets/theme1/';
} else if(themename == "theme2"){
var stylePath = "./app.component_theme2.scss";
var graphicFolder = '/assets/theme2/';
}
}
然后是 @component 及其 styleUrls: [stylePath]
由于某种原因不考虑 if 条件,结果总是首先声明的主题(在上述情况下为“theme1”)将处于活动状态。因此,如果我只是更改条件中的顺序,并将主题 2 的代码放在第一位,那么将为站点选择该代码,而不管实际从 localstorage 获取哪个主题变量
我也尝试了其他几种变体,但这个似乎最接近解决方案。 Angular 在运行时 contra 构建中限制样式更改可能是个问题吗?还是我忘记了 if 条件中的一些基本内容?
最好的问候和对不起我有限的英语。 每
【问题讨论】:
-
是的,在这些解决方案适合的几个标签中。但我认为,如果整个网站都改变主题,它们将是笨拙的工具。我必须在网站的大多数标签中设置大量的 ngclass 和 ngsyle 条件。可能有几十个具有不同样式表和图像文件夹的主题。 ngsyle/ngclass 似乎只对只有两种选择的有限更改有用。
-
您尝试开发的方法感觉非常符合 Angular。我不知道这是否可能,但我一直认为@Component-decorator 中的内容是不可更改的。它是组件类型的一部分,需要定义,因此是只读的。你检查过吗?
标签: css angular dynamic styles