2015-06-16 47 views
0

我正在使用angularjs开发应用程序,并希望存储一些会话变量。无法在angularjs中检索服务对象的属性

我对app.js代码是包含控制器,服务和工厂:以下JSON

(function(){ 
    var app = angular.module('test', []); 

app.controller('ApplicationController', function ($scope, 
               AuthService, Session) { 
    $scope.currentUser = null; 
    this.Session = Session; 
    console.log(Session); 
    console.log(Session.id); 

    $scope.isAuthenticated = AuthService.isAuthenticated; 

    if (!$scope.isAuthenticated()) { 
    AuthService.login(); 
    } 

}); 

app.service('Session', function() { 

    var session = {}; 

    session.create = function(sessionId, userId, userRole) { 
     session.id = sessionId; 
     session.userLogin = userId; 
     session.userRole = userRole; 
    }; 

    session.destroy = function() { 
     session.id = null; 
     session.userLogin = null; 
     session.userRole = null; 
    }; 

    return session; 
}); 

    app.factory('AuthService', function ($http, Session) { 
    var authService = {}; 

    authService.login = function() { 
     return $http 
     .get('authenticate.php') 
     .then(function (res) { 
      Session.create(res.data.session_id, res.data.login, res.data.role_id); 
     }); 
    }; 

    authService.isAuthenticated = function() { 
     return !!Session.id; 
    } 

    return authService; 
    }); 

})(); 

authenticate.php可以包含例如:

{"session_id":"076d89db-141a-11e5-8e8f-18a9059996df","login":"test","role_id":"2","error":null} 

的问题是,我不能检索会话变量(Session对象的字段),即使它们已设置。在控制器初始化期间,我打印Session变量,它包含所有字段 - iduserNameuserRole,但是当我打印Session.id时,我得到未定义的值。

如何访问这些字段?

感谢,兹比涅克

回答

0

我个人从来没有使用this语法服务,而且不知道它是如何工作 - 我用下面的一种语法,它一直运作良好既为服务功能+存储变量。

app.service('Session', function() { 

    var session = {}; 

    session.create = function(sessionId, userId, userRole) { 
     session.id = sessionId; 
     session.userLogin = userId; 
     session.userRole = userRole; 
    }; 

    session.destroy = function() { 
     session.id = null; 
     session.userLogin = null; 
     session.userRole = null; 
    }; 

    return session; 
}); 
+0

谢谢,我已经尝试过了,但至今没有运气。我编辑了帖子,所以现在它包含完整的app.js文件和json,工厂预期 – Zbynek

0

尝试这样的:

app.service('Session', function() { 
    var session = this; 
    this.create = function (sessionId, userId, userRole) { 
    session.id = sessionId; 
    session.userLogin = userId; 
    session.userRole = userRole; 
    }; 

    this.destroy = function() { 
    session.id = null; 
    session.userLogin = null; 
    session.userRole = null; 
    }; 
}); 
+0

谢谢,但不幸的是,该应用程序仍然表现相同。我已经编辑了这篇文章,所以现在它包含完整的app.js文件和json,实际上工厂 – Zbynek

0

嗯,控制台日志记录发生在AuthService开始创建会议之前,即另外使用一个异步HTTP请求 - 所以我敢肯定它的成员将在那个时候总是没有定义。

尝试在Session.create(res.data.session_id, res.data.login, res.data.role_id);调用后移动日志记录。

+0

预期,第一个日志记录(object'Session')记录具有其所有属性的对象,只记录后续日志记录 - Session。 id'记录未定义的值。第一次,会话是空的,但在刷新时,它应该(并且确实)包含值,我只是允许访问它们。 – Zbynek

+0

因此,在ApplicationController中使用之前,您是否在其他地方创建Session? – Rob

+0

不,我想只声明会话一次 - 在第一次访问页面时,用户被认证('AuthService.login()'),他的凭证存储在Session中。刷新后,我想检查是否设置了会话标识,如果是,则省略步骤,我尝试对用户进行身份验证 – Zbynek