詳解angular中的作用域及繼承
在一些使用angular框架的大型項目中,似乎有很多個controller,而每個controller都有自己的$scope.
1、$rootscope
$rootScope頂級作用域,也叫根作用域,類似于window,window的屬性在任何子作用域都可以訪問。$rootScope則是所有controller進行數(shù)據(jù)溝通的中間域,即在$rootScope中的數(shù)據(jù),在每個controller中都能通過$rootScope.xxx獲取到。
2、$scope
(1)作用
$scope 就在視圖和控制器之間建立了一個橋梁,基于作用域視圖在修改數(shù)據(jù)時會立刻更新 $scope,同樣的 $scope 發(fā)生改變時也會立刻重新渲染視圖.每個控制器controller對應一個$scope,通過為其屬性賦值,可以傳遞數(shù)據(jù)給模板渲染.
(2)生命周期
創(chuàng)建:在創(chuàng)建控制器或指令時,AngularJS會用$injector創(chuàng)建一個新的作用域,并在這個新建的控制器或指令運行時將作用域傳遞進去。
鏈接:當Angular開始運行時,所有的$scope對象都會附加或者鏈接到視圖中。所有創(chuàng)建$scope對象的函數(shù)也會將自身附加到視圖中。這些作用域?qū)援擜ngular應用上下文中發(fā)生變化時需要運行的函數(shù)。這些函數(shù)被稱為$watch函數(shù),Angular通過這些函數(shù)獲知何時啟動事件循環(huán)。
更新:當事件循環(huán)運行時,它通常執(zhí)行在頂層$scope對象上(被稱作$rootScope),每個子作用域都執(zhí)行自己的臟值檢測。每個監(jiān)控函數(shù)都會檢查變化。如果檢測到任意變化,$scope對象就會觸發(fā)指定的回調(diào)函數(shù)。
銷毀:當一個$scope在視圖中不再需要時,這個作用域?qū)謇砗弯N毀自己。盡管永遠不會需要清理作用域(因為Angular會為你處理),但是知道是誰創(chuàng)建了這個作用域還是有用的,因為你可以使用這個$scope上叫做$destory()的方法來清理這個作用域。
3、原型繼承
scope是AngularJS中的作用域(其實就是存儲數(shù)據(jù)的地方),很類似JavaScript的原型鏈 。搜索的時候,優(yōu)先找自己的scope,如果沒有找到就沿著作用域鏈向上搜索,直至到達根作用域rootScope。
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body ng-app="myApp">
<div ng-controller="parentController">
{{name}}
<div ng-controller="sonController">
{{name}}
</div>
</body>
<script type="text/javascript" src="./angular.min.js"></script>
<script>
var parentController=function($scope){
$scope.name="parent";
}
var sonController=function($scope){
console.log($scope.name);//parent
}
parentController.$injector=["$scope"];
sonController.$injector=["$scope"];
angular.module("myApp",[])
.controller("parentController",parentController)
.controller("sonController",sonController)
</script>
</html>
首先子控制器在自己的作用域內(nèi)查找name屬性,沒找到,向父控制器找。
補充一點,如何在子控制器中修改父控制器中$scope的值,可見如下:
$scope.$parent.name="son";在子控制器中$scope.$parent就表示父控制器中的$scope,然后修改其值即可。
4、$new
$scope.$new(isolated,parent);用于定義scope的child scope
1)參數(shù):isolated,是否是隔離的。如果值是true,那么這個scope不會從父scope繼承原型。作用域是獨立的,在這里不能看見父scope的屬性。如果值為false,則繼承自父(可以訪問父scope的所有成員),默認為false!
parent 用于指定創(chuàng)建的子scope的父scope,如果沒有此參數(shù),則父scope為調(diào)用當前$new方法的$scope
var myController=function($scope){
$scope.data="hello!"
var scope1=$scope.$new(false,$scope);
console.log(scope1.data); //hello! scope1繼承了$scope,所以可以訪問到data
var scope2=$scope.$new(true,$scope);
console.log(scope2.data);// undefined 第一個參數(shù)為true,表示是隔離的,無法繼承,自己又沒有,故為undefined
}
myController.$injector=["$scope"];
angular.module("myApp",[])
.controller("myController",myController)
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
詳解angularjs獲取元素以及angular.element()用法
本篇文章主要介紹了詳解angularjs獲取元素以及angular.element()用法 ,具有一定的參考價值,有興趣的可以了解一下2017-07-07
AngularJS實現(xiàn)表單手動驗證和表單自動驗證
本文是對AngularJS表單驗證,手動驗證或自動驗證的講解,對學習JavaScript編程技術有所幫助,感興趣的小伙伴們可以參考一下2015-12-12
AngularJs unit-testing(單元測試)詳解
本文主要介紹AngularJs unit-testing(單元測試)的內(nèi)容,這里整理了單元測試的知識,及示例代碼,有興趣的朋友可以參考下2016-09-09
Angular 1.x個人使用的經(jīng)驗小結(jié)
這篇文章主要給大家介紹了關于Angular 1.x個人使用的一些經(jīng)驗,屬于一些基礎入門教程,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。2017-07-07
詳解如何為你的angular app構(gòu)建一個第三方庫
這篇文章主要介紹了詳解如何為你的angular app構(gòu)建一個第三方庫,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12

