【发布时间】:2017-11-30 17:51:47
【问题描述】:
我的应用程序中有一个颜色名称列表。
let colours = {
mango: '#e59c09',
midnight: '#1476a0'
};
我想扩展 ngStyle 指令以便能够理解我的自定义颜色名称。我通过decorating ngStyle 指令来执行此操作。但是,我在装饰器的编译功能上遇到了一场艰苦的战斗。我可以访问元素的 ngStyle 属性,但它以字符串的形式出现(可以理解)。 JSON.parse() 无法使用它,因为由于绑定一次等原因,它并不总是有效的 JSON 字符串......
我只是想介入,遍历所有样式键,如果它包含color,我想检查该值 - 如果它是上述自定义颜色之一,则用十六进制替换。
我似乎无法访问任何 ngStyle 内部函数,而且source code 令人困惑且简短;它似乎只是设置元素 CSS - $parse 在哪里工作?例如,当ng-style="{color: ctrl.textColor}" - ngStyle 源代码中没有任何东西在拉取ctrl.textColour 的值。我看错地方了吗?
无论如何,我如何访问 ng-style 键值以便我可以将自定义颜色更改为其十六进制代码?
这是我目前在装饰器中得到的:
$provide.decorator('ngStyleDirective', function($delegate) {
let directive = $delegate[0];
let link = directive.link;
directive.compile = function(element, attrs) {
// Expression here is a string property
let expression = attrs.ngStyle;
return function(scope, elem, attr) {
// How do I iterate over and update style values here?
// Run original function
link.apply(this, arguments);
}
}
return $delegate;
});
我尝试使用正则表达式提取模式等并检查元素,但是,这对我来说似乎是解决问题的错误方法,因为我必须手动更新字符串并将其传递给基本链接函数。
这是plnkr example。
如果有更好的方法来做我想做的事,请告诉我。
【问题讨论】:
-
注意:这个问题已经得到解答,我想为下面的回答者奖励一个写得很好且易于理解的答案。
标签: javascript angularjs angularjs-directive decorator ng-style