我有一个Firebase数据存储,我可以访问它来加载列表。我想显示$ ionicLoading指示符,直到列表完全加载并实际显示在页面上。
出于某种原因,似乎$ ionicLoading确实出现了,但它的时间很短,甚至没有显示出来。然而在页面上,列表仍然需要1-3秒才能加载并显示。我做错了吗?
我的controllers.js部分如下:
.controller('ListCtrl', function($scope, ListService, LoaderService) {
var message="Loading list...";
LoaderService.showLoader(message);
ListService.listAll().then(function(data){
$scope.list = data;
LoaderService.hideLoader();
});
})
我返回列表保证的services.js部分如下:
.factory('ListService', function($q, $firebaseArray) {
var refList =
new Firebase('https://my-list-db.firebaseIO.com/coupons');
return {
listAll: function() {
var deferred = $q.defer();
var items = $firebaseArray(refList);
deferred.resolve(items);
return deferred.promise;
}
};
})
.factory('LoaderService', function($ionicLoading){
//var LoadingObj= new $ionicLoading;
return {
showLoader: function(loadingMessage){
//loadingMessage="Loading List...";
$ionicLoading.show({
template: loadingMessage
});
},
hideLoader: function(){
$ionicLoading.hide();
}
};
});
答案 0 :(得分:1)
您无需在承诺中解析$firebaseArray()
,因为它在加载$loaded()
时会返回承诺。
请改为尝试:
.constant('FirebaseUrl', 'https://my-list-db.firebaseIO.com/')
.service('rootRef', ['FirebaseUrl', Firebase])
.factory('ListService', function(rootRef, $firebaseArray) {
var refList = rootRef.child('coupons');
return $firebaseArray(refList);
})
.controller('ListCtrl', function($scope, ListService, LoaderService) {
var message = "Loading list...";
LoaderService.showLoader(message);
$scope.list = ListService;
$scope.list.$loaded.then(function(data){
LoaderService.hideLoader();
});
})
但是,您应该知道通常不需要$loaded()
。因为当数据加载时,AngularFire会触发$digest
循环,数据将出现在屏幕上。因此,您可以将ListService
分配给范围,然后解析$loaded()
以了解何时关闭LoaderService
。
答案 1 :(得分:0)
您可以使用$ loaded与工厂或服务的实例一起显示加载消息,并在加载数据时隐藏它。
<div id="outer">
<p>top of #outer</p>
<div id="inner">
#inner
</div>
<div id="push"></div>
</div>
然后你可以在控制器中使用它:
.factory("Trendingpackages", function($firebaseArray) {
var TrendingpackagesRef = new Firebase("https://brilliant-torch-4678.firebaseio.com/items");
return $firebaseArray(TrendingpackagesRef);
})