gpt4 book ai didi

javascript - AngularJS 工厂变量变为未定义

转载 作者:行者123 更新时间:2023-11-29 21:45:59 25 4
gpt4 key购买 nike

我在工厂中有一个用户变量,它在切换 Controller 后一直未定义。我在一个 Controller 中设置变量。当我登录用户时,它会出现我期望的数据,但是当我切换 Controller 并检索变量时,它再次未定义。这是代码:

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;
});

});

最佳答案

您通过为 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 访问(在第二种情况下,如果注入(inject)工厂,任何 Controller 都可以直接引用用户)。

关于javascript - AngularJS 工厂变量变为未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31169346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com