做爲一個coder,應該具備常常總結反思的習慣,若是不能及時總結,可能就會忘記本身踩過的不少坑,而後會致使同一個坑踩不少次,因此我打算把這些都記錄下來,以方即是對本身的重複記憶,避免無效的coding,另外一方面能夠但願能夠給遇到類似問題的同僚們一些收穫.html
在開發過程當中,咱們可能常常會經過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
這個指令在表單校驗的時候很是有用,咱們能夠設置何時出發試圖更新,這樣你就能夠設置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
咱們都知道,當頁面還未加載完畢的時候會出現{{ xxx }}這種尷尬的狀況,經過使用ng-bind-template指令,就能夠避免尷尬狀況的出現.ide
<p ng-bind-template="{{name}}"></p> //使用示例
(1) 將html片斷抽出,經過指令引入ng-include,ng-bind-html
(2) 經過ng-cloak指令函數
(1)路由傳參
//傳遞 $state.go(path, {name:"dfdd"}) ui-sref="path({name:"dfdd"})" //獲取 $scope.$stateParams.name
(2)經過廣播
經過子元素傳遞給父元素,而後父元素再廣播給其餘子元素,注意這個廣播是很快就完成的,因此頗有可能出現子頁面還未加載完父元素的廣播就已經完成了,爲了不這種狀況,須要父元素的廣播延遲執行.
(這種狀況有一個弊端,當進入子頁面後再次刷新頁面,此次的廣播已經沒有了,就會致使這個子頁面的數據獲取失敗了.)
(3)定義全局變量(window)
將多個控制器都須要通信的變量定義爲全局的.這樣每一個控制器均可以訪問到和改寫.
(4) 緩存
sessionStorage, localStorage, cookie,瀏覽器的各類數據庫
以上方法我的比較推薦路由傳參的方式
(1)頁面離開時清除頁面的定時器
(2)頁面離開時清除頁面的監聽器
(3)頁面離開時清除頁面的modal,popover之類的遮罩層.
var destroyWatcher = $scope.$watch(...); //示例代碼 //$watch方法會返回一個函數,這個函數用來銷燬監聽器,咱們用一個變量承接這個函數,而後再destory的時候調用這個函數就能夠銷燬沒必要要的監聽器了. $scope.$on("$destroy", function() { if (timer) { $timeout.cancel(timer); } $scope.popover.remove(); destroyWatcher(); }
就先寫到這兒了,後面會持續更新...