來(lái)源:qq_41778967 發(fā)布時(shí)間:2018-07-02 15:21:54 閱讀量:1558
1.背景介紹
AngularJs是一個(gè)用于設(shè)計(jì)動(dòng)態(tài)web應(yīng)用的結(jié)構(gòu)框架,使得開發(fā)現(xiàn)代的單一頁(yè)面應(yīng)用程序變得更加容易。而且能夠簡(jiǎn)化我們的工作流程,讓我們只專心于業(yè)務(wù)邏輯和數(shù)據(jù)的處理.$scope $rootScope $watch 和 $state就是里面的幾個(gè)方法,今天著重跟大家討論一下這 幾個(gè)方法
2.知識(shí)剖析
$SCOPE
$scope在angularjs中,你可以把它理解成作用域,每個(gè)不同的controller,都具有它不同的作用域,所以 controller不同,他們的scope是不同的,那么,如果我們想象js那樣,做一個(gè)全局變量該怎么辦呢?這就要說(shuō) 到rootScope了。
$ROOTSCOPE
$rootScope就相當(dāng)于一個(gè)全局作用域,所以我們保存在其中的東西是全局性的,在任一controller之中都能夠使用。
scope是html和單個(gè)controller之間的橋梁,數(shù)據(jù)綁定就靠他了。rootscope是各個(gè)controller中scope的橋梁。 用rootscope定義的值,可以在各個(gè)controller中使用。
$WATCH
相信使用過(guò)angularjs的同學(xué)都知道,ng中有個(gè)比較重要的特點(diǎn),叫做雙向綁定,那么這個(gè)雙向綁定是如何實(shí)現(xiàn)的呢? 當(dāng)我們?cè)趯?duì)綁定的name屬性進(jìn)行修改的時(shí)候,angular內(nèi)部的$digest循環(huán)級(jí)會(huì)執(zhí)行一次,他執(zhí)行的內(nèi)容是檢查我們的 $scope作用域的內(nèi)容與上次執(zhí)行$digest循環(huán)的時(shí)候是否有變化,若有變化就執(zhí)行$watch()方法綁定的處理函數(shù)。從而 達(dá)到了監(jiān)聽作用域?qū)傩缘男Ч?/p>
$watch(watchExpression, listener, objectEquality);
watchExpression,需要監(jiān)控的表達(dá)式
listener,處理函數(shù),函數(shù)參數(shù)如下 function(newValue,oldValue, scope)
objectEquality,是否深度監(jiān)聽,如果設(shè)置為true,它告訴Angular檢查所監(jiān)控的對(duì)象中每一個(gè)屬性的變化. 如果你希望監(jiān)控?cái)?shù)組的個(gè)別元素或者對(duì)象的屬性而不是一個(gè)普通的值, 那么你應(yīng)該使用它
$STATE
在ajax技術(shù)發(fā)展普及之后,因?yàn)槠洳粫?huì)留下歷史記錄方便瀏覽器訪問和對(duì)于seo不友好的特點(diǎn),一個(gè)新技術(shù)應(yīng)運(yùn)而生: 路由,$state就是路由中的一項(xiàng)服務(wù)。
$state.go()
$state.go()方法可以產(chǎn)生與a鏈接一樣的效果,可以將此方法綁定給一個(gè)button按鈕, 然后在按鈕的點(diǎn)擊事件中執(zhí)行 $state.go(),就可以跳轉(zhuǎn)到相應(yīng)的頁(yè)面。
3.常見問題
4.解決方案
watch的深度監(jiān)聽是什么意思呢?有什么優(yōu)缺點(diǎn)呢?
4.解決方案
$watch在對(duì)待原始類型和引用類型會(huì)有不同的處理方式,這就要首先說(shuō)一說(shuō)$watch函數(shù)的第三個(gè)參數(shù)。在前面的例子中,我們知道,$watch函數(shù)有接收兩個(gè)參數(shù),第一個(gè)參數(shù)是需要監(jiān)視的對(duì)象,第二個(gè)參數(shù)是在監(jiān)視對(duì)象發(fā)生變化時(shí)需要調(diào)用的函數(shù),實(shí)際上$watch還有第三個(gè)參數(shù),它在默認(rèn)情況下是false。在默認(rèn)情況下,即不顯式指明第三個(gè)參數(shù)或者將其指明為false時(shí),我們進(jìn)行的監(jiān)視叫做“引用監(jiān)視”。引用監(jiān)視的原詞的“reference watch”,它的意思是只要監(jiān)視的對(duì)象引用沒有發(fā)生變化,就不算它發(fā)生了變化。
如果我們將$watch的第三個(gè)變量設(shè)置為true,那么此時(shí)我們進(jìn)行的監(jiān)視叫做“全等監(jiān)視”,原詞是“equality watch”。此時(shí),只要$watch的對(duì)象有一點(diǎn)風(fēng)吹草動(dòng),它馬上就跳出來(lái)
既然全等監(jiān)視這么好,那么我們?yōu)槭裁床恢苯佑萌缺O(jiān)視呢?當(dāng)然,任何事情都有好的壞的兩個(gè)方面,全等監(jiān)視固然是好,但是它在運(yùn)行時(shí)需要先遍歷整個(gè)監(jiān)視對(duì)象,然后在每次$digest之前使用angular.copy()將整個(gè)對(duì)象深拷貝一遍然后在運(yùn)行之后用angular.equal()將前后的對(duì)象進(jìn)行對(duì)比,
$watch在對(duì)待原始類型和引用類型會(huì)有不同的處理方式,這就要首先說(shuō)一說(shuō)$watch函數(shù)的第三個(gè)參數(shù)。在前面的例子中,我們知道
5.提問
根作用域可不可以訪問到控制器內(nèi)的作用域。
不能訪問到,這個(gè)和JS中的變量和全局變量差不多。
watch是如何執(zhí)行的。
當(dāng)雙向綁定的某一項(xiàng)值改變之后watch就會(huì)執(zhí)行,循環(huán)一次,改變另一項(xiàng)值。
怎么才能更簡(jiǎn)單的理解根作用域和作用域
這個(gè)的話你可以仔細(xì)的去了解一下JS中的作用域和根作用域
原文地址https://blog.csdn.net/qq_41778967/article/details/80861778
在線
客服
服務(wù)時(shí)間:周一至周日 08:30-18:00
選擇下列產(chǎn)品馬上在線溝通:
客服
熱線
7*24小時(shí)客服服務(wù)熱線
關(guān)注
微信
關(guān)注官方微信