新しいルートごとに読み込みGIFを切り替え(非表示/表示)しようとしているので、ロジックは次のようになります。
これは私のコードです:
//ANGULAR
app.run(function($rootScope) {
$rootScope.layout = {};
$rootScope.layout.loading = false;
$rootScope.$on('$routeChangeStart', function() {
//show loading gif
$rootScope.layout.loading = true;
});
$rootScope.$on('$routeChangeSuccess', function() {
//hide loading gif
$rootScope.layout.loading = false;
});
$rootScope.$on('$routeChangeError', function() {
//hide loading gif
alert('wtff');
$rootScope.layout.loading = false;
});
});
// HTML
<img src="img/loading.gif" ng-hide="!layout.loading"/>
これは変更された3/4ルートで機能し、ルートの変更中に機能を停止するため、奇妙です:O
それは何でしょうか?
ここIS @Rob Sedgwickのおかげでライブの例: http://plnkr.co/edit/ZpkgRhEAoUGlnXjbLb8b
短い答え:$rootScope.layout.loading
は期待どおりに変更されました。ただし、テンプレートが読み込まれている場合、ブラウザには変更を表示する時間がありません。
長い答え:console.log
リスナーに$on
出力を入れた場合$routeChangeStart
イベントが発生し、テンプレートが読み込まれ、その後$routeChangeSuccess
が発生することがわかります。内部では、次のことが起こります。
$routeChangeStart
火災$rootScope.layout.loading
はtrue
になります少し後で(xhrリクエストが返されます)
$routeChangeSuccess
火災$rootScope.layout.loading
はfalse
になりますtmeplateがキャッシュされた場合はどうなりますか:-$routeChangeStart
が発生します-$rootScope.layout.loading
がtrue
になります--$routeChangeSuccess
が発生します--$rootScope.layout.loading
がfalse
になります- DOMが更新されます(ただし、これは以前と同じ状態です)
ご覧のとおり、ブラウザにDOMをレンダリングする時間を与えるために中断されていないスクリプトが実行されているため、ブラウザは新しい状態をレンダリングできません。テンプレートがまだロードされていない場合、ajaxリクエストはスクリプトの実行を停止し、ブラウザにDOMをレンダリングする時間を与えます。
これを修正する方法は?
ブラウザにDOMを更新する時間を与えるtimeout
を使用できます。
$rootScope.$on('$routeChangeSuccess', function () {
console.log('$routeChangeSuccess');
//hide loading gif
$timeout(function(){
$rootScope.layout.loading = false;
}, 200);
});
このソリューションを使用したプランカーは次のとおりです。 http://plnkr.co/edit/MkREo0Xpz5SUWg0lFCdu?p=preview
(コメントを入れるには少し多すぎます)
コードを設定したところ、読み込み変数が毎回更新されておらず、テンプレートのキャッシュが原因であることがわかりました。「RouteChange」はトリガーされていないと思います。
テンプレートキャッシュを無効にすると、コードが毎回実行されます。
app.run(function($rootScope, $location, $anchorScroll, $routeParams,$templateCache) {
$rootScope.$on('$viewContentLoaded', function() {
$templateCache.removeAll();
});
....