如何强制 ng-style 添加到现有样式?

Posted

技术标签:

【中文标题】如何强制 ng-style 添加到现有样式?【英文标题】:How do I force ng-style to ADD to an existing style? 【发布时间】:2015-05-20 00:32:41 【问题描述】:

我有一个自定义 popover 指令和另一个使用该指令的自定义指令。我正在尝试使用 ng-style 设置弹出框的宽度。这是指令的 html 模板中的代码 sn-p:

<div my-custom-popover ng-style="'width': widthVar">
    ...
</div>

这里是有趣的地方:my-custom-popover 也应用了 ng 样式。这是my-custom-popover的html模板中的一些代码:

<div ng-style="display: (condition ? 'block' : 'none')">
    ...
</div>

问题在于,当 Angular 尝试渲染我的指令时,而不是聪明地简单地将我的 ng 样式添加到现有指令中,它只是将它们连接起来并导致解析错误。当浏览器看到我的标记时,它看起来像ng-style='width': widthVar display: (condition ? 'block' 'none'),这显然是不正确的。

有没有办法告诉 Angular 我的 ng 样式应该附加到现有的样式中,而不仅仅是像正在完成的那样连接?

【问题讨论】:

您尝试放入模板了吗? 对不起,我可能不清楚。这两个代码 sn-ps 都来自各自指令的模板。我将编辑原始问题。 在使用指令时使用style="width:widthVar",在指令模板中使用ng-style 【参考方案1】:

一般来说,使用内联 CSS 规则不是一个好主意,因为如果您在不同的元素中有多个相同的规则并且需要更改它们,则必须在每个元素中都这样做,这可能会很麻烦,而且您可能会错过一个。相反,我只是导入一个 css 文件,以便可以轻松更改规则。

话虽如此,我将在您的指令中使用 ng-class 代替 ng-style 并将 CSS 规则应用于特定的类。

例如,你可以替换

ng-style="display: (condition ? 'block' : 'none')"

ng-class="'show-div': show, 'hide-div': !show"

然后创建一个 css 文件并应用以下规则:

.show-divdisplay:block;
.hide-divdisplay:none;

【讨论】:

【参考方案2】:

显然,目前无法合并属性:read this open issue。

或者,您可以考虑在自定义指令中使用以下suggested workaround:

compile: function compile(tElement, tAttrs, transclude) 
  tAttrs.ngClass = tAttrs.ngClass.replace(/\s*/g, ', ');
  // ...

然后它通过在编译之前将 替换为 , 将不正确的 'width': widthVar display: (condition ? 'block' 'none') 修复为 'width': widthVar, display: (condition ? 'block' 'none')

See also dariocravero's fiddle.

【讨论】:

以上是关于如何强制 ng-style 添加到现有样式?的主要内容,如果未能解决你的问题,请参考以下文章

Angular ng-style 正在添加一个样式属性,然后不保持同步 [重复]

从现有样式继承并为派生样式添加新形状

在AngularJS中添加带有'ng-style'的背景图片

如何在不覆盖现有样式的情况下向 WPF 自定义控件添加触发器?

如何在 ng-style 指令中根据多个条件应用多种样式?

如何根据“ng-repeat”计数分配“ng-style”指令值