更新
我已经组合了一个名为 ngCss的 Angular “插件”(模块+过滤器+工厂) ,它可以处理这个以及更多问题 -看看吧!
我也制作了 Vanilla Javascript(例如,没有外部依赖项)版本;CjsSS.js(GitHub)。
ngCss是一个微小的* Angular Module+Factory+Filters,可以在 CSS 中绑定字符串和对象(包括嵌套对象)。*1,700 字节以下的缩小+压缩脚本
特征:
- CSS 可以是实时绑定的(更改
$scope
是$watch
'ed)或通过自定义$broadcast
事件 updateCss 更新。
- css 和 cssInline 过滤器将 Javascript/JSON 输出
objects
为 CSS 以启用混合,包括嵌套的能力objects
。
$scope
可以在 CSS 本身内初始化,允许所有与 CSS 相关的信息位于 *.css 或 STYLE 元素中。
$scope
可以从任何 Angular 中隔离或导入$element
(通过angular.element($element).scope()
)。
原创
感谢@jonnyynnoj 的代码,我找到了一种将{{angular_variable}}
命名法保留在样式标签内以及实时绑定任何更改的方法。查看@jonnyynnoj 代码的fork 以获得一个简单的示例,或者看看下面我在我的应用程序中使用的内容:
(function (ngApp) {
'use strict';
//# Live bind a <style cn-styler="{ commented: true, usingSingleQuote: true }" /> tag with {{ngVars}}
ngApp.directive('cnStyler', function () {
return {
//# .restrict the directive to attribute only (e.g.: <style cn-styler>...</style>)
restrict: "A",
link: function ($scope, $element, $attrs, controllers) {
//# .$eval the in-line .options and setup the updateCSS function
//# NOTE: The expected string value of the inline options specifies a JSON/JavaScript object, hence the `|| {}` logic
var css, regEx,
options = $scope.$eval($attrs["cnStyler"]) || {},
updateCSS = function () {
//# .$eval the css, replacing the results back into our $element's .html
$element.html($scope.$eval(css));
}
;
//# Setup the .quote and the inverse in .unquote (which we use to process the css)
//# NOTE: In theory, the .unquote should not be present within the css
options.quote = (options.usingSingleQuote !== false ? "'" : '"');
options.unquote = (options.quote === '"' ? "'" : '"');
regEx = new RegExp(options.unquote, "g");
//# Process the $element's .html into css, .replace'ing any present .unquote's with .quote's (this could cause problems), then the {{Angular}} (or /*{{Angular}}*/) variables with ' + stringified_versions + '
if (options.commented !== false) {
css = options.unquote + ($element.html() + '')
.replace(regEx, options.quote)
.replace(/\/\*{{/g, options.unquote + "+")
.replace(/}}\*\//g, "+" + options.unquote)
+ options.unquote;
} else {
css = options.unquote + ($element.html() + '')
.replace(regEx, options.quote)
.replace(/{{/g, options.unquote + "+")
.replace(/}}/g, "+" + options.unquote)
+ options.unquote;
}
//# .$watch for any changes in the $scope, calling our updateCSS function when they occur
$scope.$watch(updateCSS);
}
};
});
})(YOUR_NG_APP_VAR_HERE);
然后你像这样使用这个指令:
<style cn-styler type="text/css">
.myClass{
color: /*{{themeColor}}*/;
}
</style>
您在控制器中设置$scope.themeColor
的某个位置并已替换YOUR_NG_APP_VAR_HERE
为ngApp
变量。
笔记:
确保您在标签的ng-controller
范围内定义了<style>
标签,因为<style>
标签应该在<head>
通常ng-controller
在<body>
标签上或下面定义的时候。TL;DR:像这样把你的标签放在ng-controller
你的标签上<html>
:
<html ng-app="YOUR_NG_APP_VAR_HERE" ng-controller="MyNgController">
由于Visual Studio等工具中的 CSS 解析和自动格式化,我添加了{{Angular}}
在 CSS 注释中包含变量的功能(例如/*{{Angular}}*/
)。这是指令的默认行为,除非您像这样覆盖它:
<style cn-styler="{commented: false}" >...</style>
由于此解决方案的性质(CSS 被.$eval
视为其中插入变量的字符串),还需要处理 CSS 中单引号或双引号的存在。默认情况下,该指令假定您在 CSS 中使用单引号 ('),这意味着为了避免任何引入的错误,您应该只在 CSS 中使用单引号,因为 CSS中存在的任何双引号都将被单引号替换。您可以像这样覆盖此默认行为(意味着您在 CSS 中使用双引号):
<style cn-styler="{usingSingleQuote: false}" >...</style>
在某些极端情况下,用单引号替换双引号会破坏 CSS(例如 in content
),因此您需要确保在 CSS 中仅使用一种样式的引号(并相应地发出指令)以避免任何潜在的问题。谢天谢地,CSS 中很少使用引号,所以这基本上不是问题。