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