以下代码通过服务读取并在网页上显示特定“页面类别”(字符串)的“页面”对象列表。使用 $routeProvider.when() 中的解析对象属性,我可以推迟更新视图,直到新值准备好。
两个问题:
当要求一个新的页面列表时,我想显示一个加载图标。当从服务器读取开始(并且应该显示加载图标)时,我如何检测(以非黑客方式)事件?我想我可以在服务中做类似 $('.pages-loading-icon').show() 的事情,但是发现太依赖于 gui 太放置在服务中。
当新值准备好时,我希望旧的淡出而新的淡入。这样做的“角度”方式是什么?我曾尝试使用 $watch 在控制器中执行此操作,但这会导致在淡出开始前不久显示新值。
编码:
应用程序.js:
$routeProvider.when('/:cat', { templateUrl: 'partials/view.html', controller: RouteCtrl, resolve: RouteCtrl.resolve});
控制器.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;
}
};
})
视图.html
<ul >
<li ng-repeat="page in pages">
<a href="#{{params.cat}}/{{page.slug}}">{{page.title}}</a>
</li>
</ul>