2014-03-27 73 views
3

这里是我的代码:AngularJS指令controllerAs语法和范围

// 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插入到标签中。但是,一旦我将范围设置为true,控制器将仅适用于myDirective。

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

UPDATE

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

回答

3

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

+0

谢谢,乔恩。我一直在想,在指令的内部,控制器只会适用于它的范围,将范围设置为true,只需在指令的范围内创建一个“子”范围。 >< – Neaped

5

我想你在问关于Angular Directives中的scope属性。此外,我认为你的意思是$ rootScope的术语'全球'。作为this guide解释说,在一个指令,scope属性的作用如下所示,

scope.false

不为指令 但股价范围创建一个新的作用域的默认选项与其父

scope.true

创建一个新的作用域,但是从父作用域原型继承。

范围: '隔离'

创建一个孤立的范围,其不从 prototypically继承父范围,但你可以使用范围内访问父范围$父

+0

感谢您的详细信息,但我只能给一票; < – Neaped