对象不从工厂方法传递给控制器

时间:2015-12-21 18:48:17

标签: angularjs controller factory

我正在尝试创建一个工厂,该工厂将查询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());时,它显示未定义。经过大量的研究,我无法弄清楚这一点。非常感谢帮助。

1 个答案:

答案 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;
    });
}]);