角度服务变量没有更新
我有以下服务(伪代码)
app.service('user', function($http) {
function login(email, password, callback) {
// login user
// set isLoggedIn to true
// assign the returned user object to userData
// issue callback
};
return {
isLoggedIn: false,
userData: null,
login: login
};
});
这是我的登录控制器:
app.controller('LoginController', function($scope, $http, $location, user) {
user.login($scope.email, $scope.password, function(isSuccess, data, status) {
if (isSuccess) { $scope.onSuccessfulLogin(); }
else { $scope.loginStatusMessage = data; }
});
$scope.onSuccessfulLogin = function() {
$location.path('/someOtherPage');
};
});
这里是/someOtherPage
使用的控制器
app.controller('SomeOtherPageController', function($scope, $http, $modal, user) {
// lots of stuff in here
// I put a breakpoint on the first line and user.isLoggedIn is false
// even though it was definitely set to true when the user logged in.
)};
一旦使用user
服务登录时发出回调,如果登录成功,用户将被带到不同的控制器的页面,其中上述user
服务被注入。 问题是,如果登录成功,虽然我可以看到isLoggedIn
和userData
变量被正确赋值,但在新的控制器中,它们分别保持为false
和null
。
我在这里错过了什么吗? 每当user
像单身人士注入时,我需要的值是相同的。
谢谢
您需要使用服务,而不是工厂。 服务是返回你的函数的一个实例。 这意味着一旦注入每个人都将使用相同的实例。 在你的情况下,你正在使用一个工厂(自从我发布我的答案以来,你已经更新了它),并且每次注入它时都会返回从该函数返回的值。 在这里最好的SO帖子是在这里AngularJS:服务vs提供者vs工厂
当我想把这点指向家庭时,我倾向于使用服务。 我希望人们知道他们是否注入了这些,每个人都将分享同一个对象。 我经常将它与Cache和用户一起使用。
app.service('user', function($http) {
var that = this;
this.isLoggedIn = false;
this.login = function(email, password, callback) {
that.isLoggedIn = true;
// login user
// set isLoggedIn to true
// assign the returned user object to userData
// issue callback
};
return this;
})
这里的问题是你正在返回一个用null和false实例化的对象:
return {
isLoggedIn: false,
userData: null,
login: login
};
它应该返回另一个闭包变量。
return {
isLoggedIn: myIsLoggedIn,
userData: myUserData,
login: login
};
myUserData
和myIsLoggedIn
在login
功能中设置。 或者另一条路线是返回返回这些值的方法,如@Sten提到的那样。
实际上,角度上的所有服务都是单例。 检查此stackoverflow更多信息。 任何人,直接从你的问题,这直接从Angular文档:
有角服务有:
Lazily实例化 - Angular只在应用程序组件依赖它时实例化一个服务。
单身 - 依赖于服务的每个组件获取对由服务工厂生成的单个实例的引用。
你应该使用一个工厂,因为你只需要重新创建揭示模块模式,Angular在工厂实现,该服务是一个构造函数。
除了这两点之外,您的服务仅仅为这两个值返回null和false,无论您在服务中如何将其更改为内部值,这些值都始终为null和false。 您正在返回一个对象,因此您需要正确连接键值对。
app.factory('user', function($http) {
var service = {};
service.userData = null;
service.isLoggedIn = false;
service.login = function(email, password, callback) {
// login user
// set isLoggedIn to true
this.isLoggedIn = true;
// assign the returned user object to userData
this.userData = someValue;
// issue callback
}
return service;
});
链接地址: http://www.djcxy.com/p/77829.html
上一篇: Angular service variables not updating
下一篇: AngularJS services vs factory advantages and shortcomings