1

我有一个元素,它既有控制器又有指令,并应用了隔离范围:

scope: {
    dirVar: '='
}

目标是仅在变量为真时运行指令的某些部分。我在控制器中设置该变量并尝试通过 attr 将其传递给指令。

问题是当我做类似的事情时

<div ng-controller="MyCtrl" my-directive active="ctrlVar"></div>

并尝试使用 进入active指令scope.active,它总是出现未定义。

这是一个例子:http: //jsfiddle.net/u3t2u/1/

关于为什么或如何正确执行此操作的任何解释?我认为问题在于控制器和指令被应用于同一个元素并希望解决这个问题。

另一种选择是删除指令的隔离范围并让它评估传递给它的 attr,但我不确定如何做到这一点($parse不断抛出错误)。

4

3 回答 3

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
}
于 2013-06-28T03:42:00.187 回答
1

那是因为您的指令不在控制器内部。尝试这个:

<div ng-app="myApp">
    <div ng-controller="MyCtrl">
        <div my-directive="" active="myValue">
             Testing.
        </div>
    </div>
</div>
于 2013-06-28T02:43:13.793 回答
0

我对某些东西不太熟悉,比如 transclude 和创建一个孤立的范围,但这是我在阅读 Directives 的文档和摆弄后得到的:

http://jsfiddle.net/u3t2u/4/

我只更改了 html 的这一部分:

<div ng-controller="MyCtrl">
    <div my-directive active="myValue">
    Testing.
    </div>
</div>

我相信在这种情况下,您实际上不必将值传递给my-directive指令,因为您已经在使用带有=. 对不起,如果我的解释不是那么好。您可以在http://docs.angularjs.org/guide/directive阅读更多内容,在Writing directives (long version)部分下。

于 2013-06-28T02:48:11.503 回答