次のコードは、サービスを介して読み取り、特定の「ページ カテゴリ」(文字列) の「ページ」オブジェクトのリストを Web ページに表示します。$routeProvider.when() でオブジェクトの解決プロパティを使用すると、新しい値の準備ができるまでビューの更新を延期できます。
2 つの質問:
新しいページリストを要求するときに、読み込み中のアイコンを表示したい。サーバーからの読み取りが開始されたときのイベントを(ハックではない方法で)検出するにはどうすればよいですか(そして読み込みアイコンが表示されるはずです)?サービスで $('.pages-loading-icon').show() のようなことができると思いますが、サービスに配置されすぎてGUIに依存しすぎていることがわかりました。
新しい値の準備ができたら、古い値をフェードアウトさせ、新しい値をフェードインさせたいと思います。これを行う「角度のある」方法は何ですか? $watch を使用してコントローラーで実行しようとしましたが、フェードアウトが始まる直前に新しい値が表示されます。
コード:
app.js:
$routeProvider.when('/:cat', { templateUrl: 'partials/view.html', controller: RouteCtrl, resolve: RouteCtrl.resolve});
controllers.js:
function RouteCtrl($scope, $routeParams, pages) {
$scope.params = $routeParams;
$scope.pages = pages;
}
RouteCtrl.resolve={
pages: function($routeParams, Pages){
if($routeParams.hasOwnProperty('cat')){
return Pages.query($routeParams.cat);
}
}
}
services.js: 最後に読み取られたページは currentPages に保存され、そのカテゴリは lastCat に保存されます。
factory('Pages', function($resource, $q, $timeout){
return {
res: $resource('jsonService/cat=:cat', {}, {
query: {method:'GET', params:{cat:'cat'}, isArray:true}
}),
lastCat: null,
currentPages: null,
query: function(cat) {
var res = this.res;
if(cat != this.lastCat){
var deferred = $q.defer();
var p = res.query({'cat':cat}, function(){
deferred.resolve(p);
});
this.lastCat = cat;
this.currentPages = deferred.promise;
}
return this.currentPages;
}
};
})
view.html
<ul >
<li ng-repeat="page in pages">
<a href="#{{params.cat}}/{{page.slug}}">{{page.title}}</a>
</li>
</ul>