2016-03-02 29 views
0

我有一個使用UI路由器的角度應用程序。我已經訂閱了$ stateChangeStart和$ stateChangeSuccess事件,並且我正在使用ng-show指令來顯示/隱藏「isLoading」的控制器屬性,以獲取UI視圖標籤外部的加載指示器以外的。我可以通過代碼進行調試,看到事件正在觸發,變量正在JS中設置,但似乎在開始和成功事件之間,DOM從不更新,因此我的加載指示器從不顯示。我能得到加載指示器的唯一方法是添加0秒的$超時並在那裏進行變量更新。

$rootScope.$on("$stateChangeStart", function() { 
    ctrl.isLoading = true; 
}); 
$rootScope.$on("$stateChangeSuccess", function(ev, to, toParams, from, fromParams) { 
    $timeout(function() { 
     ctrl.isLoading = false; 
    }, 0); 
}); 

此JSFiddle http://jsfiddle.net/uwhetx7q/2/演示我正在努力。

當應用$超時時,即使在0秒時,加載指示燈也會閃爍。但沒有它,我的變量永遠不會$ apply'd。

我試着實際調用$ apply和$ digest,但是我得到這些方法已經在進行的錯誤。

我希望有一些超級明顯,我很想念這將讓我的負荷指標顯示,因爲空$超時是一個壞的解決方案:)

謝謝!

+0

我想加載working..but狀態變化太快,我們無法看到加載 –

回答

1

您有一個範圍/摘要 - 時間問題。你的ctrl.isLoading會被設置,但是這個東西(我猜的是微調)並不立即認識到這一點。在當前的摘要循環之後,您的變量將被更新。

做到這一點(這是常見和有效的):目前的消化週期已結束後

$rootScope.$on("$stateChangeSuccess", function(ev, to, toParams, from, fromParams) { 
    $timeout(function() { 
     ctrl.isLoading = false; 
    }); 
}); 

沒有任何時間$超時運行。約

更多信息範圍/消化/應用:http://www.codingeek.com/angularjs/angular-js-apply-timeout-digest-evalasync/

+0

很好的鏈接。所以是我的$超時必要的,因爲ui路由器是第三方庫,所以角度不知道ita的變化?我認爲ui團隊會想到這一點。 – rictionaryFever

+0

這只是一個計時問題(雙向數據綁定)。 – CodeNashor