頂層服務(wù)對(duì)象$rootScope來(lái)源于ng模塊,由$RootScopeProvider提供。因?yàn)閚g模塊是angular.bootstrap()執(zhí)行時(shí)依賴的模塊,所以在整個(gè)應(yīng)用中都可以通過(guò)$rootScope引用,而且在這個(gè)應(yīng)用中是唯一的。但唯一性僅限于單個(gè)應(yīng)用內(nèi),因?yàn)榉?wù)都存在注入器中,而每個(gè)bootstrap應(yīng)用有自己的注入器,所以,$rootScope作為一個(gè)服務(wù),在不同的應(yīng)用中是不同的,彼此互不影響。
除了頂層的$rootScope,子Scope分為普通子Scope和孤立子Scope:普通Scope繼承自父Scope,因此可以在普通子Scope中直接訪問(wèn)父Scope的屬性;孤立Scope和父Scope沒(méi)有繼承關(guān)系,所以不能直接訪問(wèn)父Scope的屬性,但通過(guò)$parent屬性可以訪問(wèn)父Scope對(duì)象。
不論普通子Scope還是孤立子Scope,都可以通過(guò)$scope.$root訪問(wèn)$rootScope。
$childScope = $parentScope.$new(isolate,parent)
參數(shù)isolate為布爾值,如果為true,表示創(chuàng)建的子Scope是孤立的。
參數(shù)parent沒(méi)有賦值,默認(rèn)是$parentScope。
$scope.$watch(watchExp, listener,objectEquality)
參數(shù)watchExp是被監(jiān)控的表達(dá)式。參數(shù)listener是監(jiān)聽(tīng)方法。參數(shù)objectEquality是布爾值,如果為true,表示比較方式為對(duì)象的比較,而不是基本類型相互比較。如果是對(duì)象比較,只要兩個(gè)對(duì)象的屬性一致,則同樣也認(rèn)為是相等的。
每執(zhí)行一次$watch()方法創(chuàng)建一個(gè)watcher對(duì)象,這個(gè)watcher對(duì)象包含以下屬性:
fn: 即參數(shù)listener。
get: $parse(watchExp)得到的方法。
exp: 即參數(shù)watchExp。
eq:即參數(shù)objectEquality。
last: 參數(shù)watchExp上一次的執(zhí)行結(jié)果。
其中監(jiān)聽(tīng)方法listener的接受的參數(shù)分別為:
value:這次執(zhí)行的結(jié)果。
last:上次執(zhí)行的結(jié)果。
current:當(dāng)前scope對(duì)象。
表達(dá)式解析之后,方法get()的參數(shù):
current:scope對(duì)象。
$scope.$watchGroup(watchExps, listener)
監(jiān)測(cè)一組表達(dá)式,只要其中一個(gè)表達(dá)式發(fā)生變化,就執(zhí)行Listener。
監(jiān)聽(tīng)方法listener的接受的參數(shù)分別為:
newValues:這次執(zhí)行的結(jié)果。
oldValues:上次執(zhí)行的結(jié)果。
current:當(dāng)前scope對(duì)象。
$scope.$watchCollection(collection,listener)
監(jiān)測(cè)數(shù)組等集合對(duì)象是否發(fā)生了變化。
原理:在JavaScript中,數(shù)組和對(duì)象一樣是有屬性的,數(shù)組的索引就是數(shù)組的元素。所以$watchCollection其實(shí)就是遍歷集合的索引屬性,通過(guò)監(jiān)測(cè)每個(gè)屬性值的變化來(lái)判斷集合是否發(fā)生了變化。當(dāng)然,集合長(zhǎng)度發(fā)生變化也在監(jiān)測(cè)范圍。
var destroyFn = $scope.$on(name, listener);
destroyFn(); // remove this listener
監(jiān)聽(tīng)指定事件,并返回摧毀該事件監(jiān)聽(tīng)的destroy方法。
事件監(jiān)聽(tīng)接受的第一個(gè)參數(shù)是event對(duì)象,event對(duì)象的屬性如下:
name:事件名。
targetScope:目標(biāo)scope。
currentScope:當(dāng)前scope。
stopPropagation:方法,中斷執(zhí)行。
preventDefault:方法,取消默認(rèn)行為。
defaultPrevented:如果preventDefault()被執(zhí)行過(guò),則為true。
事件監(jiān)聽(tīng)listener中的this指向null。
把Scope的層級(jí)結(jié)構(gòu)比作一個(gè)從上而下的樹(shù),向下派發(fā)就是從根節(jié)點(diǎn)到子節(jié)點(diǎn)的過(guò)程。
在當(dāng)前Scope派發(fā)事件,并派發(fā)給所有的子Scope(包括后代Scope),這個(gè)與瀏覽器的事件派發(fā)完全不同。更重要的是,事件是按樹(shù)的深度優(yōu)先順序派發(fā)的:根節(jié)點(diǎn)à左節(jié)點(diǎn)à…à左葉子節(jié)點(diǎn)à右葉子節(jié)點(diǎn)à…à右節(jié)點(diǎn)。
$scope.$broadcast(name, args);
從當(dāng)前Scope開(kāi)始,向父Scope派發(fā)事件。
$scope.$emit(name, args);
原理:通過(guò)$scope的$parent訪問(wèn)父Scope,從而實(shí)現(xiàn)向父scope派發(fā)事件。這個(gè)過(guò)程和瀏覽器事件的冒泡過(guò)程相似。
在當(dāng)前Scope范圍內(nèi)執(zhí)行表達(dá)式。
$scope.$eval(expr, locals);
$scope.$apply(expr);
// == $parse(expr)(this, locals)
方法$eval()和$apply()的區(qū)別:$apply()會(huì)捕獲expr執(zhí)行中的異常,而$eval()不會(huì)。所以$eval()適合Angular內(nèi)部代碼調(diào)式使用。而$apply()一般是在瀏覽器事件監(jiān)聽(tīng),setTimeout等方法中被使用。
http://geek.csdn.net/news/detail/65949
移動(dòng)一小步,視界大不同!
更多程序員技術(shù)交流,奇聞?shì)W事,
聯(lián)系客服