AngularJS工厂变量变为未定义

时间:2015-07-01 18:49:14

标签: javascript angularjs controller mongoose factory

我在工厂内有一个用户变量,在切换控制器后不断变化。我在一个控制器中设置变量。当我记录用户时,它会显示我期望的数据,但是当我切换控制器并检索变量时,它再次未定义。这是代码:

discussionBoard.factory('userFactory', function($http){

    console.log("I'm loading the userFactory");

    var user = {};

    var factory = {};

    factory.createUser = function(user, callback){
        $http.post('/users/new', {user: user})
            .success(function(response){
                user = response[0];
                callback(user);
            })
    }

    factory.retrieveUser = function(callback){
        callback(user);
    }

    console.log(user);

    return factory;

});

discussionBoard.controller('dashCtrl', function($scope, topicFactory, userFactory){

    $scope.createTopic = function(){
        topicFactory.createTopic(function(topic){
            $scope.topic = topic;
        })
    }

    userFactory.retrieveUser(function(user){
        $scope.user = user;
    });

});

编辑:经过一些实验后,我可以通过在工厂对象中添加用户作为对象来实现这一点。然而,这实际上提出了另一个问题,关于工厂如何与AJAX进行交互,因为看起来.success()无法访问工厂的范围。这是有效的代码,但如果有人能说出为什么这样安排,我会很好奇:

discussionBoard.factory('userFactory', function($http){

    var factory = {};

    factory.createUser = function(user, callback){
        $http.post('/users/new', {user: user})
            .success(function(response){
                factory.user = response[0];
                callback(factory.user);
            })
    }

    factory.user = {};

    factory.retrieveUser = function(callback){
        callback(factory.user);
    }

    return factory;

});

discussionBoard.controller('dashCtrl', function($scope, topicFactory, userFactory){

    $scope.createTopic = function(){
        topicFactory.createTopic(function(topic){
            $scope.topic = topic;
        })
    }

    userFactory.retrieveUser(function(user){
        $scope.user = user;
    });

});

1 个答案:

答案 0 :(得分:2)

您通过为createUser函数指定一个相同名称的参数来隐藏工厂的user变量。

var user = {}; // <- this is going to be shadowed!

var factory = {};

factory.createUser = function(user, callback){ //<- note the user argument!
    $http.post('/users/new', {user: user})
        .success(function(response){
            user = response[0];
            callback(user);
        })
}

因此,当成功回调设置user时,它会找到该名称最接近的变量,这是createUser函数的参数。否则两种方法都非常好 - 实际上第一种方法更好,如果你想让用户字段只能通过getter访问(在第二种情况下,如果注入工厂,任何控制器都可以直接引用用户)。 / p>