Я хочу получить некоторую информацию о текущем вошедшем в систему пользователе, я сохранил переменную в currentUser, но ничего не появляется, когда я пытаюсь получить к ней доступ с моего контроллера.
authentication.service.js:
(function () {
'use strict';
angular
.module('thinkster.authentication.services')
.factory('Authentication', Authentication);
Authentication.$inject = ['$cookies', '$http'];
/**
* @namespace Authentication
* @returns {Factory}
*/
function Authentication($cookies, $http) {
/**
* @name Authentication
* @desc The Factory to be returned
*/
var Authentication = {
login: login,
register: register,
getAuthenticatedAccount: getAuthenticatedAccount,
isAuthenticated: isAuthenticated,
setAuthenticatedAccount: setAuthenticatedAccount,
unauthenticate: unauthenticate,
currentUser: ''
};
return Authentication;
////////////////////
/**
* @name register
* @desc Try to register a new user
* @param {string} username The username entered by the user
* @param {string} password The password entered by the user
* @param {string} email The email entered by the user
* @returns {Promise}
* @memberOf thinkster.authentication.services.Authentication
*/
function register(email, password, username) {
return $http.post('/api/v1/accounts/', {
username: username,
password: password,
email: email,
}).then(registerSuccessFn, registerErrorFn);
function registerSuccessFn(data ̶,̶ ̶s̶t̶a̶t̶u̶s̶,̶ ̶h̶e̶a̶d̶e̶r̶s̶,̶ ̶c̶o̶n̶f̶i̶g̶ ) {
Authentication.login(email, password)
};
function registerErrorFn(data ̶,̶ ̶s̶t̶a̶t̶u̶s̶,̶ ̶h̶e̶a̶d̶e̶r̶s̶,̶ ̶c̶o̶n̶f̶i̶g̶,) {
console.info(data)
}
}
function login(email, password){
return $http.post('/api/v1/auth/login/', {
email: email,
password: password
}).then(loginSuccessFn, loginErrorFn);
function loginSuccessFn(data ̶,̶ ̶s̶t̶a̶t̶u̶s̶,̶ ̶h̶e̶a̶d̶e̶r̶s̶,̶ ̶c̶o̶n̶f̶i̶g̶ ) {
Authentication.setAuthenticatedAccount(data.data);
// pass data through to dashboard controller
window.location = '/dashboard'
Authentication.currentUser += data.config.data.email
console.info(Authentication.currentUser)
}
function loginErrorFn(data, status, headers, config) {
console.error('Failed');
console.info(data)
}
}})();
dashboard.controller.js
// контроллер приборной панели
(function() {
'use strict';
angular
.module('thinkster.authentication.controllers')
.controller('DashboardController', DashboardController);
DashboardController.inject = ['$location, $scope', 'Authentication'];
function DashboardController($location, $scope, Authentication){
var vm = this;
vm.user_info = user_info
//vm.user_info2 = user_info
function user_info() {
return Authentication.currentUser
}
}
})();
Я пытаюсь обновить currentUser в loginSuccessFn(), он успешно обновляется в сервисе. Я вижу это в консоли, но не когда пытаюсь сослаться на это в своем контроллере. заранее спасибо
Контроллер приборной панели немедленно обращается к Authentification.currentUser, но служба устанавливает только ту переменную после, когда ответ приходит от сервера.
Привет, спасибо за ответ, как бы это исправить?
Интересно, придется ли мне получать currentUser от моего контроллера входа, потому что таким образом я мог бы вернуть значение в обещании
Метод .then возвращает новое обещание, которое разрешает то, что возвращается в блок .then. Когда блок .then пропускает оператор return, функция возвращает undefined. Производное обещание разрешится как undefined. Вдобавок отклоненное обещание будет преобразованный для выполненного обещания, которое разрешается в undefined.
Итак, вы говорите, что я просто вернул currentUser в свой сервис? Или мне следует сделать то, что я предложил, и вместо этого вернуть его в свой контроллер входа в систему?
Как этот другой пост отвечает на мой вопрос? Я прочитал это и все еще не уверен
Для всех остальных в будущем это легко: я просто добавил оператор if (), чтобы получить значение после того, как я нахожусь на определенной веб-странице в своем контроллере. Значение извлекается из функции в службе, которая извлекает пользователя из файлов cookie.


Во-первых, почему вы устанавливаете переменную с помощью + =
(Authentication.currentUser += data.config.data.email)
Установите текущего пользователя, используя =
Authentication.currentUser = data.config.data
Authentication.currentUser = data.config.data.email
Второй user_info - это функция, поэтому вы должны ее вызвать, изменить
vm.user_info = user_info в vm.user_info = user_info()
Также я бы использовал camelCase для функций и under_score для полей объекта для удобства чтения и согласованности.
пример
function userInfo() { // camelCase
return Authentication.currentUser;
}
var vm = this
vm.user_info = userInfo() // under_score object
Эй, это тоже не работает, я пробовал обе эти настройки раньше. Это потому, что я получаю currentUser до того, как сделан запрос?
Да, это должно быть проблемой, потому что, когда я жестко кодирую значение для currentUser, оно работает
да, вы должны установить значение (завершить запрос и действие) перед получением точки данных.
Хорошо, как мне это сделать? Как мне получить значение после того, как запрос сделан? с .then()?
ты имеешь в виду дать тебе мой плункер?