最近在做一個用angular框架寫的一個管理平台項目,在對按鈕的權限管理中,使用了$rootScope來存儲權限數據,但發現個問題,就是在頁面加載的時候,有時候頁面會綁定不了權限的數據,但這種幾率很小,但卻會發生,讓人摸不到頭腦。
權限的獲取數據是通過監聽路由的變化來請求接口獲取相應頁面的權限數據,該是數據是綁定在$rootScope上的,在頁面加載時都能獲取到$rootScope下的權限數據,但卻沒有綁定在頁面上,這個問題讓我百思不能其解,於是我在網上查閱了各種關於作用域的問題,關於$rootScope和$scope的區別,它們之間就像是javaScript的原型鏈的關系,子作用域上沒有找到該屬性就向上一級父作用域上查詢,但在這個問題上,明顯頁面上綁定$rootScope的該視圖,由於某種原因可能是頁面加載問題使得顯示值為undefined。
於是我選擇用$scope的方式賦值,於是我在子controller中獲取$rootScope的btnPress的屬性值,然后將其付給$scope綁定的一個變量下,但打印出來卻是undfined,原來$rootScope下的btnPress是在主模塊的作用域下賦值的,而在該模塊的控制器作用域下,由於先后順序問題,是不能訪問的,因為該控制器下沒有定義該屬性,於是這個方法也行不同。
后來才知道,angular有個重要特性,就是依賴注入,通過service、factory、provider等方式將數據儲存,然后注入到控制器中,然后綁定,因為這樣做的好處是不僅簡單明了,而且還能避免使用全局變量$rootScope的問題。