Ответ 1
Короткий ответ: $rootScope.layout.loading
изменился, как ожидалось. Но если шаблоны загружены, браузер не успевает сделать изменения видимыми.
Длинный ответ: если вы поставите console.log
выходы в ваших $on
слушателей, вы увидите, что $routeChangeStart
срабатывает событие, шаблон загружается и после этого $routeChangeSuccess
пожары. Под капотом происходит следующее:
-
$routeChangeStart
срабатывает -
$rootScope.layout.loading
становитсяtrue
- шаблон загружается асинхронно
- обновлен DOM
- браузер отображает загрузку gif
немного позже (возвращается запрос xhr)
- был загружен шаблон
-
$routeChangeSuccess
срабатывает -
$rootScope.layout.loading
становитсяfalse
- обновлен DOM
- браузер больше не показывал gif
что произойдет, если tmeplates будут кешированы:
- $routeChangeStart
пожары
- $rootScope.layout.loading
становится true
- $routeChangeSuccess
пожары
- $rootScope.layout.loading
становится false
- DOM обновляется (но это то же самое состояние, что и раньше)
Как вы можете видеть, браузер не может отобразить новое состояние, потому что работает script, который не прерывается, чтобы дать браузеру время для рендеринга DOM. Если шаблон еще не загружен, запросы ajax останавливают выполнение script и дают время браузера для отображения DOM.
Как это исправить?
Вы можете использовать timeout
, которые дают время браузера для обновления DOM:
$rootScope.$on('$routeChangeSuccess', function () {
console.log('$routeChangeSuccess');
//hide loading gif
$timeout(function(){
$rootScope.layout.loading = false;
}, 200);
});
Вот ваш plunkr с этим решением: http://plnkr.co/edit/MkREo0Xpz5SUWg0lFCdu?p=preview