Firebase 从 angular 工厂获取数据
Firebase getting data from angular factory
我必须建立一个工厂,我希望它 return 从 fire-base 获取的数据。工厂是这样的:
.factory('companyFactory', function($firebaseArray) {
var itemsRef = new Firebase("https://somename.firebaseio.com/");
var allNodes=$firebaseArray(itemsRef);
var myObject={
getNames: function() {
itemsRef.once("value", function(snapshot) {
var nameSnapshot = snapshot.child("companyName");
var name = nameSnapshot.val();
return name; //this does not return the data
});
}
}
return myObject;
});
在我的控制器中,我这样做:
$scope.companies=companyFactory.getNames();//not working
我应该怎么做才能让它正常工作。我想获取一次数据,然后使用工厂将其提供给不同的视图
对 Firebase 的请求 itemsRef.once
是异步的,因此您需要使用 promise 对 return names
.
var myObject={
getNames: function() {
var defer = $q.defer();
itemsRef.once("value", function(snapshot) {
var nameSnapshot = snapshot.child("companyName");
var name = nameSnapshot.val();
defer.resolve(name); //this does not return the data
});
return defer.promise;
}
并且在您的调用代码中,您需要使用承诺回调模式来获取数据。
companyFactory.getNames().then(function(data) {
$scope.companies=data;
});
我必须建立一个工厂,我希望它 return 从 fire-base 获取的数据。工厂是这样的:
.factory('companyFactory', function($firebaseArray) {
var itemsRef = new Firebase("https://somename.firebaseio.com/");
var allNodes=$firebaseArray(itemsRef);
var myObject={
getNames: function() {
itemsRef.once("value", function(snapshot) {
var nameSnapshot = snapshot.child("companyName");
var name = nameSnapshot.val();
return name; //this does not return the data
});
}
}
return myObject;
});
在我的控制器中,我这样做:
$scope.companies=companyFactory.getNames();//not working
我应该怎么做才能让它正常工作。我想获取一次数据,然后使用工厂将其提供给不同的视图
对 Firebase 的请求 itemsRef.once
是异步的,因此您需要使用 promise 对 return names
.
var myObject={
getNames: function() {
var defer = $q.defer();
itemsRef.once("value", function(snapshot) {
var nameSnapshot = snapshot.child("companyName");
var name = nameSnapshot.val();
defer.resolve(name); //this does not return the data
});
return defer.promise;
}
并且在您的调用代码中,您需要使用承诺回调模式来获取数据。
companyFactory.getNames().then(function(data) {
$scope.companies=data;
});