我已经在src/styles/settings/_variables.scss
中定义了SCSS变量,我将它们导入到src/styles.scss
中,但是这些变量仍然不适用于每个组件。
有没有办法制作一个全局文件,其中包含我的其余组件的所有SCSS变量?因为在每个组件@import
文件中编写.scss
非常令人沮丧,特别是如果我有许多嵌套组件。
我知道,有很多类似的问题,但似乎它们都已过时,并且与最新版本的Angular无关。
我在CLI中使用Angular 7.3。
您只需要添加更多配置,因此在声明全局变量的地方,您需要将其包装在:root{}
中。所以在src/styles/settings/_variables.scss
。
:root
{
--blue: #00b; // or any global you wish to share with components
}
然后,当您在SCSS中使用它们时,您将需要像这样访问它们。
.example-class {
background-color: var(--blue)
}
要添加有关注释的内容,此方法可以使用mixins
,@media
和keyframes
,并不仅限于颜色/字体。那就是一个例子。
根据我的理解,您需要一个全局文件src/assets/style/global
,然后将每个scss文件导入到您定义它们的位置。
@import 'filename';
如果你不希望全局变量在组件中使用,那么当你使用全局变量时。查看ViewEncapsulation,因为这可以用来忽略它们。
这就是我当前的项目如何处理全局变量,它似乎运作良好。这将消除在您使用的每个scss文件中导入变量的需要。如果您有任何问题,请注意,BR。
是否有任何方法可以为所有组件提供scss变量的全局文件?
如果不在每个组件中每次都导入全局文件,那么您希望这些sass变量可用,这是不可能的。
它在SASS中的工作方式,如果使用partials来更好地组织代码,您可以应用@import
指令进行引用。所以如果在shared/_variables.scss
中有一些sass变量:
$lightslategray: #778899;
$darkgray: #A9A9A9;
并且这些变量需要在另一个样式表中使用,带有它们的样式表必须先导入到它中:
// Shared
@import "shared/variables";
.content {
background: $lightslategray;
}
在Angular中,它以类似的方式工作(相关引用外部样式表)。因此,如果你需要一些特定的sass variables, mixins or functions
使用的component.scss
,没有其他干净的方法,但是使用component.scss
指令在@import
中引用它们。为了简化任务,您可以创建一个文件src/_variables.scss
并在component.scss
中使用这样的语法:
@import “~variables.scss”;
在角8工作对我来说。
在_variable.scss文件中,您必须添加:
:root{--my-var:#fabada}
之后进入你的angular.json并在“样式”中添加:
{"input":"yourPath/_variables.scss"}
TL; DR
不,在Angular中没有更好的方法,也没有更方便的方法来解决您的问题。
更详细的答案
如果我理解正确,你就会搞乱所有这些依赖注入,例如@import
一个特定的SCSS保存你的变量。所以,你的问题是:
这是一个错误还是一个功能?
而且,我不得不说,这是一个功能。这使得您的组件更加灵活,并且您必须关心这些依赖关系,但从长远来看,您的代码将更易于维护并且更加结构化。依赖是现代JavaScript编程的核心功能。因此,如果您愿意,您可以坚持使用更老式的编程风格,将应用程序所需的一切都放在一个文件中。这是一种更为复杂的问题。
如果您查看“反应世界”的例子,您会发现更有必要构建您的注射。您不仅要导入整个文件并将所有变量,方法,类等提供给目标组件,而是选择要在目标组件中使用的每个单个变量。这增加了规划和构建整个应用程序的工作量,但请记住长期运行。编程良好的可维护软件与马拉松比sprint有更多共同之处。
我想和你分享这个Wikipedia article about „Dependency Injection“。也许你会在那里找到你的答案。
动机
为了防止你带着不好的感觉离开你,这是H. L. Mencken的一句好话:
“对于每一个复杂的问题,都有一个明确,简单和错误的答案。”