Angular js: как использовать значения констант в других сервисах, не меняя их

Я новичок в Angular js и хочу установить глобальную переменную, которую я могу использовать в разных сервисах в качестве URL-адреса веб-сервиса.

Я реализовал app.js (модуль) следующим образом:

var app;
(function () {
    app = angular.module("ANG", []);

    app.value('user', {
        urlBase: ''
    });
})();

Когда я хочу использовать значения этих констант, я просто определяю их в определении сервиса и использую, но я хочу хранить в нем детали, поэтому мне не нужно снова и снова устанавливать значения.

Пример:

Когда я вхожу в систему, я возвращаю некоторые данные с помощью webserviceurl и устанавливаю этот URL-адрес в value.urlBase в контроллере входа в систему.

Но когда я перехожу к другому сервису и хочу использовать его, он возвращает значения ''.

КОД для использования постоянных значений:

app.service('servicename', ["$http", "$q", 'user', function ($http, $q, user) {
//access the user here but it gives value ''.
console.log(user.urlBase);
}

Как я могу сохранить сразу и использовать его снова и снова?


person 3 rules    schedule 28.02.2017    source источник


Ответы (2)


На самом деле вы можете использовать файл «констант», например:

export default angular
  .module('my.module', [])
  .constant('someConstant', Object.freeze({
    foo: 1,
    bar: 2
  })
  .name;

Мы используем Object.freeze(), но вы можете использовать immutable.js или что-то в этом роде, чтобы предотвратить мутацию.

person rrd    schedule 28.02.2017
comment
Я хочу установить предполагаемое значение foo при входе в систему и хочу использовать его после входа в каждую службу. Возможно ли это? Поскольку значения, которые я инициализирую в модуле, когда я использую это в любой службе, инициализируются снова, и я хочу получить более старое значение, которое было инициализировано во время входа в систему. - person 3 rules; 28.02.2017
comment
Как я могу использовать это в сервисе и контроллере? - person 3 rules; 28.02.2017

Я предлагаю вам другую услугу, а не ценность.

Передайте вашим службам userService, который содержит пользовательский объект, который либо доступен как свойство, либо извлекается через геттер:

app.factory('userService', function() {

    var user = {
        urlBase: ''
    };

    return {
        user: user
    };
};

app.service('servicename', ['userService', function (userService) {
    console.log(userService.user.urlBase);
}]);

Затем, когда вы устанавливаете urlBase, вы также передаете userService. Службы, как правило, являются синглтонами, поэтому пользователь должен сохраняться между другими службами.

ОБНОВИТЬ:

Поскольку вам необходимо сохранять данные между обновлениями страницы, файл cookie — неплохое решение. В вашем loginService вы устанавливаете значение cookie, а в других своих службах читаете из cookie. Это делается с помощью службы $cookies в Angular (https://docs.angularjs.org/api/ngCookies/service/$cookies)

app.service('loginService', ['$cookie', function ($cookies) {
    $cookies.put('userUrl', 'http://urlhere');
}]);

app.service('servicename', ['$cookie', function ($cookies) {
    console.log($cookies.get('userUrl'));
}]);

Другой вариант — использовать локальное хранилище, и в этом SO есть пример этого и сохранения состояния:

Как хранить данные в локальном хранилище с помощью Angularjs?< /а>

person Jono Stewart    schedule 28.02.2017
comment
Вы должны установить urlBase при успешном входе в систему userService.user.urlBase=ваш URL, и вы можете использовать это в любом месте с добавлением зависимости userService. - person Ankit Badiya; 28.02.2017
comment
@AnkitBadiya Нет, каждый раз, когда я пытаюсь использовать его, он снова инициализируется, и я получаю пустое значение в urlBase. - person 3 rules; 28.02.2017
comment
дайте ссылку на планк - person Ankit Badiya; 28.02.2017
comment
@AnkitBadiya, пожалуйста, найдите это неполным jsFiddle, возможно, вы сможете это исправить, сэр. - person 3 rules; 28.02.2017
comment
@AnkitBadiya да, именно то, что я хотел, но в моем случае на странице моего приложения перезагружается другой URL-адрес, новый контроллер и новый вызов службы, в то время как он исчезает. Я не знаю, в чем проблема. В любом случае большое спасибо. буду разбираться заранее. - person 3 rules; 28.02.2017
comment
@padhiyar, если ваше приложение является SPA (одностраничное приложение), тогда загрузите service.js по умолчанию и используйте ленивую загрузку для загрузки controller.js, тогда у вас не возникнет проблемы. - person Ankit Badiya; 28.02.2017
comment
@padhiyar, как намекнул Анкит Бадия, SPA немного отличается от классического постраничного приложения. Обновление всегда стирает угловой контекст. Фактически, обновление страницы перезагрузит все приложение Angular. Для службы входа рассмотрите возможность установки значения файла cookie или рассмотрите локальное хранилище. (я отредактирую ответ выше) - person Jono Stewart; 28.02.2017
comment
@AnkitBadiya Нет, у меня есть ASP.NET MVC с приложением angular js, которое переходит к разным URL-адресам, и у меня есть один единственный файл controller.js, файл service.js и app.js. app.js — это файл, в котором я установил factory для urlBase. Это структура моего приложения. - person 3 rules; 28.02.2017
comment
@JonoStewart хорошо, я понимаю, что вы говорите, сэр, я жду обновленного ответа. - person 3 rules; 28.02.2017
comment
@padhiyar обновлен. Существует также другой вариант - некоторые могут утверждать, что он предпочтительнее, чем файл cookie, поскольку файлы cookie можно отслеживать, - который должен обрабатывать данные пользователя на стороне сервера и всякий раз, когда страница обновляется, получать их с сервера. Вам все равно нужно будет хранить ссылку на то, где найти данные на сервере, опять же, локальное хранилище или файл cookie, или даже из токена в URL-адресе. - person Jono Stewart; 28.02.2017
comment
@JonoStewart Когда вы определили обновление, вы создали две службы, одну для определения, а другую для использования? Можно ли установить этот файл cookie в модуле и использовать его в каждой службе, которая будет создана в будущем? - person 3 rules; 28.02.2017
comment
@padhiyar правильно - одна из них - ваша служба входа в систему, а другая - любая другая служба, которая хочет прочитать значение из службы $cookies. Файлы cookie передаются между страницами в заголовках запросов, поэтому обновления страниц сохранят значения до истечения времени ожидания. Ознакомьтесь с документацией angular (теперь ссылка в ответе), чтобы узнать, как изменить тайм-ауты. - person Jono Stewart; 28.02.2017
comment
@JonoStewart Хорошо, я посмотрю на это и попытаюсь реализовать надежду, что это сработает для меня. - person 3 rules; 28.02.2017