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