Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/468.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 服务中的属性未更新_Javascript_Angularjs_Angular Ui Router - Fatal编程技术网

Javascript 服务中的属性未更新

Javascript 服务中的属性未更新,javascript,angularjs,angular-ui-router,Javascript,Angularjs,Angular Ui Router,我的身份验证服务有点问题。我的服务中基本上有以下内容: angular.factory('authentication',[…,function()){ var currentUser={}; 返回{ 登录:函数(){ currentUser={username:'Foo'}; }, 注销:函数(){ currentUser={}; } 用户:当前用户; } })] 在我的AppCtrl中,我有: angular.module('App').controller('AppCtrl',[…,fu

我的
身份验证
服务有点问题。我的服务中基本上有以下内容:

angular.factory('authentication',[…,function()){
var currentUser={};
返回{
登录:函数(){
currentUser={username:'Foo'};
},
注销:函数(){
currentUser={};
}
用户:当前用户;
}
})]
在我的
AppCtrl
中,我有:

angular.module('App').controller('AppCtrl',[…,function()){
$rootScope.$on(“$stateChangeSuccess”,函数(){
console.log(authentication.user);
});
}]);
在我的
LogoutCtrl
中,我有以下内容:

angular.controller('LogoutCtrl',[…,function()){
authentication.logout();
$state.go('login');
}]);
一旦状态更改为
登录
,控制台仍会打印
用户名:“Foo”

有什么想法吗

angular.factory('authentication', [..., function() {
    var currentUser = {};

    return {
        login: function() {
            currentUser = { username: 'Foo' };
        },
        logout: function() {
            currentUser = {};
        }
        user: currentUser;
    }
})]
您的登录/注销方法会更改变量
currentUser
的值。这些更改不会传播到
authentication.property

两种可能的修复方法:

1) 使用
this.user
而不是
var currentUser

angular.factory('authentication', [..., function() {
    return {
        login: function() {
            this.user = { username: 'Foo' };
        },
        logout: function() {
            this.user = {};
        }
        user: {};
    }
})]
2) 将
user
实现为基于getter的属性:

angular.factory('authentication', [..., function() {
    var currentUser = {};

    var auth = {
        login: function() {
            currentUser = { username: 'Foo' };
        },
        logout: function() {
            currentUser = {};
        }
    };

    Object.defineProperty(auth, 'user', {
        get: function() { return currentUser; }
    });

    return svc;
})]

在对象中进行第一次赋值时,您引用的是用户的引用。然后在调用logout()时替换该引用,以使先前绑定的旧用户保持不变。将其改为getter函数:

...
getUser: function() {
    return user; // always the correct reference
}

现在在console.log中调用它,它就会起作用。

您是否尝试应用$scope.$apply()?
getUser:function(){return currentUser;}
似乎已经成功了。谢谢