官术网_书友最值得收藏!

第5章 作用域與事件

5.1 AngularJS作用域詳解

從本書的第一個案例開始,我們就已經(jīng)接觸到了AngularJS的作用域,并且前面的每一個案例都和作用域息息相關(guān),本章就對AngularJS作用域進(jìn)行更深入的介紹。

眾所周知,JavaScript對象是基于key-value鍵值對的,我們可以把JavaScript對象作為一個map數(shù)據(jù)結(jié)構(gòu)使用,而AngularJS作用域本質(zhì)上就是一個普通的JavaScript對象,形式如下:

        var obj = {
            name:'Jane',
            age:30,
            walk:function(){

            console.info("walk");
            }
        }

AngularJS作用域?qū)ο蠛推胀↗avaScript對象一樣,都可以在作用域?qū)ο笾性黾訉傩曰蛘叻椒?,不同的是我們不需要手動去?gòu)造作用域?qū)ο?,?dāng)HTML頁面中出現(xiàn)ng-app和ng-controller指令時,AngularJS框架會自動創(chuàng)建作用域?qū)ο?,我們只需將其注入即可?/p>

AngularJS程序中作用域的主要功能是存放模型數(shù)據(jù),在控制器中,我們可以修改作用域中的模型數(shù)據(jù)或在作用域中新增模型數(shù)據(jù)(例如:$scope.address = 'China'),然后在視圖中通過AngularJS表達(dá)式展示模型數(shù)據(jù)(例如:{{address}})。

每個AngularJS應(yīng)用至少會有一個名稱為$rootScope的作用域,它是AngularJS應(yīng)用的根作用域。前面我們接觸過ng-app指令,它可以出現(xiàn)在任何HTML標(biāo)簽中,用于啟動AngularJS框架。當(dāng)AngularJS啟動時會自動創(chuàng)建一個根作用域?qū)ο?rootScope,接著當(dāng)我們使用ng-controller指令實例化控制器對象時,AngularJS框架會為我們創(chuàng)建一個子作用域$scope,默認(rèn)情況下,該子作用域會繼承$rootScope作用域的所有屬性。下面來看一個作用域?qū)ο罄^承的例子:

代碼清單:ch05\ch05_01\ch05_01.html

        <!doctype html>
        <html ng-app="app">
        <head>
            <meta charset="UTF-8">
            <title>ch05_01</title>
            <script type="text/javascript" src="/angular-1.5.5/angular.js"></
            script>
            <script type="text/javascript" src="controllers.js"></script>
        </head>
        <body ng-init="name='jane'; age=23">
            <div ng-controller="FirstController">
            </div>
        </body>
        </html>

上面使用的FirstController控制器代碼定義在controller.js文件中,代碼如下:

代碼清單:ch05\ch05_01\controllers.js

        var app = angular.module('app', []);
        app.controller('FirstController', function($scope, $log){
            $log.info("FirstController:name →" + $scope.name);
            $log.info("FirstController:age →" + $scope.age);
        });

在本案例中,我們通過ng-init指令在$rootScope作用域?qū)ο笾行略隽藘蓚€屬性,即name和age,接著使用ng-controller指令實例化FirstController控制器,此時AngularJS會創(chuàng)建一個子作用域?qū)ο罄^承自$rootScope,在FirstController控制器中輸出子作用域?qū)ο蟮膎ame和age屬性。在瀏覽器中運行ch05_01.html頁面,打開開發(fā)人員工具,控制臺輸出內(nèi)容如下:

        FirstController:name →jane
        FirstController:age →23

控制臺中輸出了name和age的屬性值,說明控制器作用域?qū)ο蟠_實繼承了$rootScope作用域的屬性。事實上$rootScope是所有作用域的父作用域(孤立作用域除外,后續(xù)會接觸到)。

需要注意的是,我們可以在ng-controller指令所在的HTML元素開始與結(jié)束標(biāo)簽之間使用另外一個ng-controller指令實現(xiàn)作用域的嵌套,例如:

        <div ng-app> <! -- 創(chuàng)建$rootScope作用域 -->
        <div ng-controller="FirstController"> <! --創(chuàng)建作用域(記為scope1)繼承
        $rootScope-->
            <div ng-controller="SecondController"> <! --創(chuàng)建作用域(記為scope2)繼承
            scope1-->
            </div>
        </div>
        </div>

在這種情況下,scope1作用域繼承自$rootScope作用域,scope2作用域則會繼承scope1作用域,$rootScope和scope1作用域中的屬性在scope2作用域中均能訪問。

主站蜘蛛池模板: 潮安县| 大同县| 宣威市| 莲花县| 东丽区| 高邮市| 平昌县| 英吉沙县| 蕉岭县| 白水县| 沽源县| 海阳市| 镇原县| 临漳县| 绥中县| 洪泽县| 陈巴尔虎旗| 元谋县| 凯里市| 新和县| 宕昌县| 砚山县| 凤庆县| 宁德市| 萝北县| 公安县| 云南省| 绥滨县| 阿拉尔市| 若尔盖县| 枣阳市| 东乡族自治县| 洛隆县| 西乌珠穆沁旗| 皋兰县| 仁化县| 海伦市| 丰顺县| 洛川县| 永清县| 西安市|