我有一个元素同时具有一个控制器和一个应用了隔离范围的指令:
scope: {
dirVar: '='
}
目标是仅在变量成立时才运行指令的某些部分。我在控制器中设置该变量并尝试通过attr。
将其传递给指令问题是当我做
之类的事情时<div ng-controller="MyCtrl" my-directive active="ctrlVar"></div>
并尝试使用active
在指令中获取scope.active
,它总是未定义。
以下是一个示例:http://jsfiddle.net/u3t2u/1/
有关为何或如何正确执行此操作的任何说明?我假设问题在于控制器和指令应用于同一个元素并希望绕过它。
另一种选择是删除指令的隔离范围并让它评估传递给它的attr,但我不确定如何做到($parse
不断抛出错误)。
答案 0 :(得分:1)
这是因为你的指令不在控制器内部。试试这个:
<div ng-app="myApp">
<div ng-controller="MyCtrl">
<div my-directive="" active="myValue">
Testing.
</div>
</div>
</div>
答案 1 :(得分:1)
结束改变我构造指令的方式,因为它不应该真的有一个隔离范围,它唯一的原因是它可以采取表达式并将它们评估为真或假。
因此我将其更改为使用$ parse,这使得指令看起来像:
var active = $parse(attrs.isActive);
// Evaluate contents of attrs.isActive
// as if they are variables within its scope,
// which is inherited from parent scopes
if(active(scope)) {
// do something
}
答案 2 :(得分:0)
我对某些事情不太熟悉,例如转录和创建一个孤立的范围,但这是我在阅读指令文档和摆弄后得到的:
我只更改了html的这一部分:
<div ng-controller="MyCtrl">
<div my-directive active="myValue">
Testing.
</div>
</div>
我相信在这种情况下,您实际上不必将值传递给my-directive
指令,因为您已经使用了=
的隔离范围。对不起,如果我的解释不是那么好。您可以在{{3>}的编写指令(长版本)部分下阅读更多内容。