AngularJS指令控制器As syntax&范围

时间:2014-03-27 04:05:57

标签: javascript angularjs angularjs-directive

这是我的代码:

// HTML

<body>
  <h1>{{foo.name}}</h1>

  <my-directive></my-directive>
</body>

//脚本

app.directive('myDirective', function() {
return {
    restrict: 'E',
    replace: true,
    scope: true,  //**********
    template: '<h4>{{foo.name}}</h4>',
    controllerAs: 'foo',
    controller: fooCtrl,
    link: function(scope) {
        console.log(scope);
    }
}
});

var fooCtrl = function() {
    this.name = 'FOO';
}

我的问题:

如果我使用controllerAs语法并且未在myDirective中设置scope:true,则控制器将变为全局,因此控制器将foo.name插入Tag。但是一旦我将范围设置为true,控制器将仅应用于myDirective。

怎么会发生这种情况?内部指令中的控制器是否创建了一个从周围范围继承的新范围?为什么它适用于全球?

更新

这是一个非常愚蠢的问题,因为我以前总是使用隔离范围,所以忘记使用范围内的指令,阅读文档并清楚地理解。谢谢你的回答

2 个答案:

答案 0 :(得分:5)

我猜您正在询问Angular Directives中的范围属性。另外,我认为你的意思是$ rootScope by term&#39; global&#39;。如 this guide 中所述,在指令中,scope属性的行为如下,

<强> scope.false

  

默认选项,不为指令创建新范围   但与其父母共享范围

scope.true

  

创建一个新范围,但原型继承自父范围。

范围:'isolate'

  

创建一个不原型继承的隔离范围   父作用域,但您可以使用作用域访问父作用域。$ parent

答案 1 :(得分:3)

查看directive documentation并向下滚动一下有关scope选项的部分。将scope设置为true会创建控制器附加到的新范围。未设置范围默认为false,这会导致指令使用父范围。这就是控制器被附加到父范围的原因。