JavaScript和AngularJS对我来说还是新手。
我无法将服务中的变量放入我的范围。这就是我正在做的事情:
myControllers.controller('UserController', function($scope, UserService) {
clearLoginForm();
updateStuff();
$scope.notifications = UserService.notifications;
function updateStuff() {
$scope.realName = UserService.realName;
$scope.loggedIn = UserService.loggedIn;
}
function clearLoginForm() {
$scope.loginName = '';
$scope.loginPassword = '';
}
$scope.login = function() {
UserService.login($scope.loginName,$scope.loginPassword);
updateStuff();
clearLoginForm();
}
$scope.logout = function() {
UserService.logout();
updateStuff();
clearLoginForm();
}
});
UserService应该保存有关登录用户的信息以及登录/注销功能以及应该从服务器轮询的帐户相关内容。
myModule.factory('UserService', function($interval) {
var loggedIn = false;
var realName = "";
var notifications = {};
resetNotifications();
function resetNotifications() {
notifications.msgCount = 0;
notifications.todoCount = 0;
notifications.ergCount = 0;
}
function login(name, password) {
if (password === 'abc') {
loggedIn = true;
realName = 'John Smith';
}
};
function logout() {
loggedIn = false;
realName = '';
resetNotifications();
}
function updateNotifications() {
if (loggedIn) {
notifications.msgCount = 1;
}
else {
resetNotifications();
}
};
$interval(updateNotifications, 10000);
return {
loggedIn : loggedIn,
realName : realName,
login : login,
logout : logout,
notifications : notifications
};
});
但它不起作用。所以我注意到如果我将登录/注销函数中的“loggedIn”更改为“this.loggedIn”(与realName相同),则值会传播到范围。为什么我需要“这个”?在我的关闭中不是“loggedIn”和“realName”吗?但这不是一个解决方案,因为现在它与updateNotifications函数中使用的“loggedIn”不同(在这里我无法将其更改为“this.loggedIn”)。
其次,我不喜欢每次服务中的值发生变化时都需要调用updateStuff()函数。但它没有用。有没有更好的方法呢?
我担心我做的事情本质上是错误的。
答案 0 :(得分:4)
当您在服务结束时返回loggedIn
时,您真正返回的是该变量的副本。因此,当您稍后在UserService内部更新它时,副本不会更新。解决这个问题的最简单方法是使用getter方法:
function getLoggedIn() { return loggedIn; }
return {
getLoggedIn: getLoggedIn
};
答案 1 :(得分:2)
你的回答有所帮助。但我发现了一个更好的方法。我只是将logIn和realName包装在一个真实对象中
var userStatus = {
loggedIn : false,
realName : ""
};
并在控制器中使用那个。这也消除了updateStuff函数的必要性。我希望这不会造成任何其他麻烦。