angularJS開發的注意事項彙總

做爲一個coder,應該具備常常總結反思的習慣,若是不能及時總結,可能就會忘記本身踩過的不少坑,而後會致使同一個坑踩不少次,因此我打算把這些都記錄下來,以方即是對本身的重複記憶,避免無效的coding,另外一方面能夠但願能夠給遇到類似問題的同僚們一些收穫.html

1.手動觸發髒檢查

在開發過程當中,咱們可能常常會經過js來手動更改綁定的相關數據,而不是經過dom操做來改變綁定的相關數據,這樣也不少狀況下會致使綁定數據的視圖不可以及時更新,這個時候就須要咱們手動觸發一下髒檢查,下面我就介紹一下三種手動觸發髒檢查的方法.數據庫

(1) $apply() 方法
在須要手動觸發的地方調用 $scope.$apply(),使用該方法會觸發angular從rootScope的做用域下開始進行綁定變量值的輪詢,相比較$digest()方法比較費時.
可是這個有時這個方法會報錯.
(2) $digest() 方法
在須要手動觸發的地方調用 $scope.$digest(),使用該方法會觸發angular從scope的做用域下開始進行綁定變量值的輪詢,相比較$aplly()更合理.
(3) $timeout()方法
將操做綁定數據的邏輯寫在$timeout()方法中.瀏覽器


找到一種更完美的解決動態添加數據致使頁面不能及時渲染的方法,火燒眉毛地來分享給你們~~~緩存

能夠定義一個全局的方法.這個方法就是通過處理過的apply函數,你們都叫它safeApply.上代碼了:cookie

$rootScope.safeApply = function(fn) {
    var phase = this.$root.$$phase;
    if(phase == '$apply' || phase == '$digest') {
        if(fn && (typeof(fn) === 'function')) {
            fn();
        } else {
            this.$apply(fn);
        }
    }
}

而後在須要動態添加吧的地方調用$rootScope.safeApply()便可,或者把須要動態添加的代碼做爲寫進$rootScope.safeApply方法的fn參數裏.session

2.ng-model-options 指令

這個指令在表單校驗的時候很是有用,咱們能夠設置何時出發試圖更新,這樣你就能夠設置dom元素失去焦點改變後調用監聽,從而顯示校驗的提示. <input>, <select>, <textarea>,這些元素支持該指令app

<input ng-model="name" ng-model-options="{updateOn: 'blur'}"> //使用示例

//可配置參數
{updateOn: 'event'}規則指定事件發生後綁定數據
{debounce : 1000} 規定等待多少毫秒後綁定數據
{allowInvalid : true|false} 規定是否須要驗證後綁定數據
{getterSetter : true|false} 規定是否做爲 getters/setters 綁定到模型
{timezone : '0100'} 規則是否使用時區dom

3. 告別使人尷尬的 {{}}

咱們都知道,當頁面還未加載完畢的時候會出現{{ xxx }}這種尷尬的狀況,經過使用ng-bind-template指令,就能夠避免尷尬狀況的出現.ide

<p ng-bind-template="{{name}}"></p>     //使用示例

4.解決ng-if,ng-show,ng-hide偶然出現的閃現的問題

(1) 將html片斷抽出,經過指令引入ng-include,ng-bind-html
(2) 經過ng-cloak指令函數

5.控制器之間的通信問題

(1)路由傳參

//傳遞
$state.go(path, {name:"dfdd"})
ui-sref="path({name:"dfdd"})"
//獲取
$scope.$stateParams.name

(2)經過廣播
經過子元素傳遞給父元素,而後父元素再廣播給其餘子元素,注意這個廣播是很快就完成的,因此頗有可能出現子頁面還未加載完父元素的廣播就已經完成了,爲了不這種狀況,須要父元素的廣播延遲執行.
(這種狀況有一個弊端,當進入子頁面後再次刷新頁面,此次的廣播已經沒有了,就會致使這個子頁面的數據獲取失敗了.)

(3)定義全局變量(window)
將多個控制器都須要通信的變量定義爲全局的.這樣每一個控制器均可以訪問到和改寫.

(4) 緩存
sessionStorage, localStorage, cookie,瀏覽器的各類數據庫

以上方法我的比較推薦路由傳參的方式

6.$destroy的使用是必要的

(1)頁面離開時清除頁面的定時器
(2)頁面離開時清除頁面的監聽器
(3)頁面離開時清除頁面的modal,popover之類的遮罩層.

var destroyWatcher = $scope.$watch(...);
//示例代碼
//$watch方法會返回一個函數,這個函數用來銷燬監聽器,咱們用一個變量承接這個函數,而後再destory的時候調用這個函數就能夠銷燬沒必要要的監聽器了.
$scope.$on("$destroy", function() {
    if (timer) {  
        $timeout.cancel(timer);  
    }  
    $scope.popover.remove();
    destroyWatcher();
}

就先寫到這兒了,後面會持續更新...

相關文章
相關標籤/搜索