为什么ng-style在同一个元素上与自定义指令一起使用时无效?

11 浏览
0 Comments

为什么ng-style在同一个元素上与自定义指令一起使用时无效?

我试图在自定义指令标签上应用ng-style属性,类似于这样:


在控制器中,我有:

$scope.myStyle = {
    "background": "red"
}

然而,这似乎不起作用。当我检查HTML时,'myStyle'没有被渲染。当我在普通的div上应用相同的ng-style标签时,它确实正确地渲染。

为什么ng-style不在自定义指令标签上起作用?

0
0 Comments

为什么ng-style在与自定义指令相同的元素上不起作用?

您的指令可能定义了一个隔离作用域:scope: { ... }。在这种情况下,所有在该元素上定义的指令都将使用隔离作用域。因此,ng-style将在隔离作用域上查找属性myStyle,但该属性不存在。

上图中的灰色线表示$parents,虚线表示原型继承。

作用域004是您的隔离作用域。作用域003是您的控制器作用域。ng-style将在作用域004中查找myStyle,找不到,然后它将沿着虚线继续查找,在作用域中也找不到。

通常情况下,您不希望在同一个元素上使用创建隔离作用域的指令以及其他指令。您有几个选择:

1. 在指令中使用scope: true而不是隔离作用域。然后,当ng-style在作用域004中查找myStyle时找不到它,它将沿着虚线(在下图中)继续查找,并在父作用域中找到它:

enter image description here

2. 在您的HTML中使用ng-style="$parent.myStyle"来访问父作用域中的myStyle属性(即,按照第一张图片中的灰色线进行访问)。

答案非常详细,非常好!

如果Mark不是在准备一本关于Angular的书,那么你应该这样做。

您的直觉正是我遇到的问题。感谢您如此详细的答案。现在我只需要弄清楚哪种解决方案对我来说最好。我的指令表示一个可重用的“小部件”,我理解对于这样的指令来说,有一个隔离的作用域是一个好的实践。我还在考虑将我的指令包装在一个div中,并将ng-style应用于这个div。

Josh的这个答案可能会帮助您决定哪种类型的作用域适合您的指令。

如果我希望在不与控制器进行交互的情况下调用指令的样式方法,有没有好的解决方案?

0