データの読み込みが完了するまで、AngularJSに読み込みスピナーを表示させるにはどうすればよいですか?
コントローラーに$scope.items = [{name: "One"}]
静的に設定し、AJAXを読み込むローダー$scope.items[0]['lateLoader'] = "Hello"
、AJAXロードが完了するまでスピナーを表示し、バインドされたスパンに取得したデータを入力します。
<ul ng-repeat="item in items">
<li>
<p>Always present: {{item.name}}</p>
<p>Loads later: <span ng-bind="item.lateLoader"><i class="icon icon-refresh icon-spin"></i></span></p>
</li>
</ul>
このコードは、バインドされたスパンにすぐに、item.lateLoader
が空の場合、スピナーは何も置き換えられません。
どうすればきれいにできますか?
私は他の答えに従ってカスタムディレクティブを作成しますが、ディレクティブなしでそれを行う方法は次のとおりです。より複雑な機能に入る前に学ぶことをお勧めします。
デモ: http://plnkr.co/edit/4XZJqnIpie0ucMNN6egy?p=preview
表示:
<ul >
<li ng-repeat="item in items">
<p>Always present: {{item.name}}</p>
<p>Loads later: {{item.lateLoader}} <i ng-hide="item.lateLoader" class="icon icon-refresh icon-spin">loading image i don't have</i></p>
</li>
</ul>
コントローラ:
app.controller('MainCtrl', function($scope) {
$scope.name = 'World';
$scope.items = [{name: "One"}];
setTimeout(function() {
$scope.$apply(function() {
$scope.items[0].lateLoader = 'i just loaded';
});
}, 1000);
});
私は実際にこのためのソリューションをしばらく使用していますが、これはうまく機能し、私の意見ではタイムアウトを使用するよりも優れています。 $ resourceを使用していますが、$ httpでも同じことができます。 $ resourceオブジェクトで、loadedをtrueに設定する次のコードにビットを追加します。
$scope.customer = $resource(dataUrl + "/Course/Social/" + courseName)
.get({}, function (data) { data.loaded = true; });
次に、私の見解では、私は使用することができます:
ng-hide="customer.loaded"
もちろん、コントローラーで$ resourceを直接使用するのではなく、customerRepositoryサービスに抽出しますが、ここでこのように表示する方が簡単でした。
カスタムディレクティブを作成し、スピナーでデフォルトのマークアップを配置します。
カスタムディレクティブに関するリンクを次に示します。
1)Eggheadの動画は素晴らしいです。 http://www.egghead.io/video/xoIHkM4KpHM
2)公式Angularディレクティブに関するドキュメント http://docs.angularjs.org/guide/directive
3)angular in 60ish minutes http://weblogs.asp.net/dwahlin/archive/2013/04/12/video-tutorial-angularjs-fundamentals- in-60-ish-minutes.aspx
@lucuma、
別の方法として、$ timeoutを挿入し、ネイティブのタイムアウト機能を置き換えることができます。
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope, $timeout) {
$scope.name = 'World';
$scope.items = [{name: "One"}];
$timeout(function() {
$scope.$apply(function() {
$scope.items[0].lateLoader = 'i just loaded';
});
}, 1000);
});