2014-03-27 117 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