scope是什么?
大家都知道在AngularJS 中作用域是一個指向應(yīng)用模型的對象,它是表達(dá)式的執(zhí)行環(huán)境。作用域有層次結(jié)構(gòu),這個層次和相應(yīng)的 DOM 幾乎是一樣的。作用域能監(jiān)控表達(dá)式和傳遞事件。
在 HTML 代碼中,一旦一個 ng-app 指令被定義,那么一個作用域就產(chǎn)生了,由 ng-app 所生成的作用域比較特殊,它是一個根作用域($rootScope),它是其他所有$Scope 的最頂層。
除了用 ng-app 指令可以產(chǎn)生一個作用域之外,其他的指令如 ng-controller,ng-repeat 等都會產(chǎn)生一個或者多個作用域。此外,還可以通過 AngularJS 提供的創(chuàng)建作用域的工廠方法來創(chuàng)建一個作用域。這些作用域都擁有自己的繼承上下文,并且根作用域都為$rootScope。
在生成一個作用域之后,在編寫 AngularJS 代碼時,$scope 對象就代表了這個作用域的數(shù)據(jù)實(shí)體,我們可以在$scope 內(nèi)定義各種數(shù)據(jù)類型,之后可以直接在 HTML 中以 {{變量名}} 方式來讓 HTML 訪問到這個變量。
繼承作用域
AngularJS 在創(chuàng)建一個作用域時,會檢索上下文,如果上下文中已經(jīng)存在一個作用域,那么這個新創(chuàng)建的作用域就會以 JavaScript 原型繼承機(jī)制繼承其父作用域的屬性和方法。
一些 AngularJS 指令會創(chuàng)建新的子作用域,并且進(jìn)行原型繼承: ng-repeat、ng-include、ng-switch、ng-view、ng-controller, 用 scope: true 和 transclude: true 創(chuàng)建的 directive。
以下 HTML 中定義了三個作用域,分別是由 ng-app 指令所創(chuàng)建的$rootScope,parentCtrl 和 childCtrl 所創(chuàng)建的子作用域,這其中 childCtrl 生成的作用域又是 parentCtrl 的子作用域。
示例一:作用域的繼承實(shí)例
<!doctype html><html><head> <meta charset=utf-8"/> <title>scope nick</title> <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script></head><script type="text/javascript"> angular.module('app', []) .controller('parentCtrl', ['$scope', function($scope) { $scope.args= 'Nick DeveloperWorks'; }]) .controller('childCtrl', ['$scope', function($scope) { $scope.args= 'Nick DeveloperWorks for test'; }]);</script><body ng-app="app"><div ng-controller="parentCtrl"> <input ng-model="args"> <div ng-controller="childCtrl"> <input ng-model="args"> </div></div></body></html>繼承作用域符合 JavaScript 的原型繼承機(jī)制,這意味著如果我們在子作用域中訪問一個父作用域中定義的屬性,JavaScript 首先在子作用域中尋找該屬性,沒找到再從原型鏈上的父作用域中尋找,如果還沒找到會再往上一級原型鏈的父作用域?qū)ふ摇T?AngularJS 中,作用域原型鏈的頂端是$rootScope,AnguarJS 將會尋找到$rootScope 為止,如果還是找不到,則會返回 undefined。
新聞熱點(diǎn)
疑難解答
圖片精選