Попытка получить доступ к переменной из моей службы в моем контроллере в AngularJS

Я хочу получить некоторую информацию о текущем вошедшем в систему пользователе, я сохранил переменную в 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(), он успешно обновляется в сервисе. Я вижу это в консоли, но не когда пытаюсь сослаться на это в своем контроллере. заранее спасибо

ты имеешь в виду дать тебе мой плункер?

Amon 22.11.2018 22:51

Контроллер приборной панели немедленно обращается к Authentification.currentUser, но служба устанавливает только ту переменную после, когда ответ приходит от сервера.

georgeawg 23.11.2018 01:59

Привет, спасибо за ответ, как бы это исправить?

Amon 23.11.2018 06:21

Интересно, придется ли мне получать currentUser от моего контроллера входа, потому что таким образом я мог бы вернуть значение в обещании

Amon 23.11.2018 06:36

Метод .then возвращает новое обещание, которое разрешает то, что возвращается в блок .then. Когда блок .then пропускает оператор return, функция возвращает undefined. Производное обещание разрешится как undefined. Вдобавок отклоненное обещание будет преобразованный для выполненного обещания, которое разрешается в undefined.

georgeawg 23.11.2018 17:05

Итак, вы говорите, что я просто вернул currentUser в свой сервис? Или мне следует сделать то, что я предложил, и вместо этого вернуть его в свой контроллер входа в систему?

Amon 23.11.2018 19:07

Как этот другой пост отвечает на мой вопрос? Я прочитал это и все еще не уверен

Amon 23.11.2018 22:39

Для всех остальных в будущем это легко: я просто добавил оператор if (), чтобы получить значение после того, как я нахожусь на определенной веб-странице в своем контроллере. Значение извлекается из функции в службе, которая извлекает пользователя из файлов cookie.

Amon 01.12.2018 19:02
Знаете ли вы, что директивы являются одной из самых мощных и универсальных функций Angular?
Знаете ли вы, что директивы являются одной из самых мощных и универсальных функций Angular?
Директивы позволяют расширять HTML новыми элементами и атрибутами и даже создавать собственные структурные директивы для манипулирования DOM. С...
Разница между Angular и React
Разница между Angular и React
React и AngularJS - это два самых популярных фреймворка для веб-разработки. Оба фреймворка имеют свои уникальные особенности и преимущества, которые...
0
8
75
1

Ответы 1

Во-первых, почему вы устанавливаете переменную с помощью + =

(Authentication.currentUser += data.config.data.email)

Установите текущего пользователя, используя =

  1. Authentication.currentUser = data.config.data

  2. 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 до того, как сделан запрос?

Amon 23.11.2018 06:22

Да, это должно быть проблемой, потому что, когда я жестко кодирую значение для currentUser, оно работает

Amon 23.11.2018 06:24

да, вы должны установить значение (завершить запрос и действие) перед получением точки данных.

andrewoodleyjr 23.11.2018 07:03

Хорошо, как мне это сделать? Как мне получить значение после того, как запрос сделан? с .then()?

Amon 23.11.2018 23:08

Другие вопросы по теме