我正在尝试创建一个工厂,该工厂将查询Firebase并迭代结果以将登录用户的配置文件对象传递给控制器。
这是工厂:
'use strict';
angular.module('myApp')
.factory('Users', ['$firebaseObject', 'Auth', function($firebaseObject, Auth) {
var usersRef = new Firebase('https://ld-tutor.firebaseio.com/users/');
var users = $firebaseObject(usersRef);
var authData = Auth.$getAuth();
var Users = {
getProfile: function(){
var uid = authData.uid;
users.$loaded().then(function(){
angular.forEach(users, function(user){
if(user.uid == uid){
return user;
}
});
});
},
};
return Users;
}]);
这是控制器:
'use strict';
angular.module('myApp.content', ['ui.router'])
.controller('DashCtrl', ['$scope', 'Users', function($scope, Users) {
$scope.profile = Users.getProfile();
}]);
问题是$scope.profile
最终未定义。如果我去工厂并将return user;
更改为console.log(user);
,那么我可以在调试区域中看到正确的对象显示。但是,当我转到控制器并将$scope.profile = Users.getProfile();
替换为$scope.profile = console.log(Users.getProfile());
时,它显示未定义。经过大量的研究,我无法弄清楚这一点。非常感谢帮助。
答案 0 :(得分:0)
如评论中所述,请从工厂返回承诺并在控制器中使用.then(function(user){ ... }
。
以下代码中users.$loaded()
之前的返回将立即返回承诺,一旦结算,then
回调将被执行。
更新了代码(未经过测试,但应该像这样工作):
工厂
'use strict';
angular.module('myApp')
.factory('Users', ['$firebaseObject', 'Auth', function($firebaseObject, Auth) {
var usersRef = new Firebase('https://ld-tutor.firebaseio.com/users/');
var users = $firebaseObject(usersRef);
var authData = Auth.$getAuth();
var Users = {
getProfile: function(){
var uid = authData.uid;
return users.$loaded().then(function(){
angular.forEach(users, function(user){
if(user.uid == uid){
return user;
}
});
});
},
};
return Users;
}]);
控制器:
'use strict';
angular.module('myApp.content', ['ui.router'])
.controller('DashCtrl', ['$scope', 'Users', function($scope, Users) {
//$scope.profile = Users.getProfile();
Users.getProfile().then(function(user) {
$scope.profile = user;
});
}]);