У меня проблема, когда я инициализирую переменную в области видимости в контроллере. Затем он изменяется в другом контроллере, когда пользователь входит в систему. Эта переменная используется для управления такими вещами, как панель навигации, и ограничивает доступ к частям сайта в зависимости от типа пользователя, поэтому важно, чтобы он сохранял свое значение. Проблема в том, что контроллер, который его инициализирует, снова вызывается с помощью angular, а затем сбрасывает переменную до ее первоначального значения.
Я предполагаю, что это не правильный способ объявления и инициализации глобальных переменных, ну, на самом деле, он не является глобальным, поэтому мой вопрос в том, как правильно и есть ли хорошие примеры, которые работают с текущей версией angular?
источник
Ответы:
У вас есть в основном 2 варианта для «глобальных» переменных:
$rootScope
http://docs.angularjs.org/api/ng.$rootScope$rootScope
является родителем всех областей, поэтому значения, отображаемые там, будут видны во всех шаблонах и контроллерах. Использовать$rootScope
очень просто, так как вы можете просто вставить его в любой контроллер и изменить значения в этой области. Это может быть удобно, но имеет все проблемы глобальных переменных .Сервисы - это синглтоны, которые вы можете внедрить в любой контроллер и выставить их значения в области видимости контроллера. Службы, будучи одиночками, по-прежнему «глобальны», но вы гораздо лучше контролируете, где они используются и предоставляются.
Использование сервисов немного сложнее, но не так много, вот пример:
а затем в контроллере:
Вот рабочий jsFiddle: http://jsfiddle.net/pkozlowski_opensource/BRWPM/2/
источник
Если вы просто хотите сохранить значение, в соответствии с документацией Angular по провайдерам , вы должны использовать рецепт Value:
Затем используйте его в контроллере следующим образом:
То же самое может быть достигнуто с помощью Provider, Factory или Service, поскольку они «просто синтаксический сахар поверх рецепта провайдера», но использование Value позволит достичь того, что вы хотите, с минимальным синтаксисом.
Другой вариант - использовать
$rootScope
, но на самом деле это не вариант, потому что вы не должны использовать его по тем же причинам, по которым вы не должны использовать глобальные переменные в других языках. Это рекомендуется , чтобы использовать с осторожностью.Поскольку все области наследуются
$rootScope
, если у вас есть переменная,$rootScope.data
и кто-то забывает, чтоdata
она уже определена и создает$scope.data
в локальной области, вы столкнетесь с проблемами.Если вы хотите изменить это значение и сохранить его на всех ваших контроллерах, используйте объект и изменяйте свойства, помня, что Javascript передается как «копия ссылки» :
Пример JSFiddle
источник
clientId
можно обновить ваш ответ ?Пример AngularJS "глобальные переменные" с использованием
$rootScope
:Контроллер 1 устанавливает глобальную переменную:
Контроллер 2 читает глобальную переменную:
Вот рабочий jsFiddle: http://jsfiddle.net/natefriedman/3XT3F/1/
источник
В интересах добавления еще одной идеи в пул вики, но как насчет AngularJS '
value
иconstant
модулей? Я только начинаю использовать их сам, но для меня это звучит так, как будто это, вероятно, лучшие варианты здесь.Примечание: на момент написания этой статьи, Angular 1.3.7 является последней стабильной версией, я думаю, что они были добавлены в 1.2.0, но не подтвердили это в журнале изменений.
В зависимости от того, сколько вам нужно определить, вы можете создать для них отдельный файл. Но я обычно определяю их непосредственно перед
.config()
блоком моего приложения для легкого доступа. Поскольку они по-прежнему являются эффективными модулями, вам нужно полагаться на внедрение зависимостей, чтобы использовать их, но они считаются «глобальными» для вашего модуля приложения.Например:
Тогда внутри любого контроллера:
Исходный вопрос на самом деле звучит так, как будто статические свойства здесь необходимы в любом случае, либо как изменяемые (значение), либо как конечные (постоянные). Это больше мое личное мнение, чем что-либо еще, но я нахожу размещение элементов конфигурации времени выполнения на
$rootScope
слишком запутанно и слишком быстро.источник
В вашем HTML:
источник
Если вы гарантированно находитесь в современном браузере. Хотя знайте, что все ваши ценности будут превращены в строки.
Также имеет удобную возможность кэширования между перезагрузками.
источник
Пожалуйста, поправьте меня, если я ошибаюсь, но когда выйдет Angular 2.0, я не верю, что
$rootScope
он будет рядом. Моя гипотеза основана на том факте,$scope
что удаляется также. Очевидно, что контроллеры все еще будут существовать, просто не вng-controller
моде. Подумайте о введении контроллеров в директивы. Так как выпуск скоро будет готов, будет лучше использовать сервисы в качестве глобальных переменных, если вы хотите более легкое время перейти с версии 1.X на 2.0.источник
Вы также можете использовать переменную окружения,
$window
чтобы глобальная переменная, объявленная вне контроллера, могла быть проверена внутри$watch
Обратите внимание, что цикл дайджеста с этими глобальными значениями длиннее, поэтому он не всегда обновляется в реальном времени. Мне нужно исследовать время этого дайджеста с этой конфигурацией.
источник
Я просто нашел другой метод по ошибке:
Что я сделал, так это объявил
var db = null
вышеупомянутое объявление приложения и затем изменил его вapp.js
то время, когда я получил к нему доступ,controller.js
я смог получить к нему доступ без каких-либо проблем. Могут быть некоторые проблемы с этим методом, о которых я не знаю, но это хорошее решение, я думаю.источник
Попробуйте это, вы не будете принудительно вводить
$rootScope
в контроллер.Вы можете использовать его только в блоке запуска, потому что блок конфигурации не предоставит вам возможность использовать сервис $ rootScope.
источник
Это на самом деле довольно легко. (Если вы все равно используете Angular 2+.)
Просто добавь
Где-то в верхней части файла вашего компонента (например, после операторов «import»), и вы сможете получить доступ к «myGlobalVarName» в любом месте вашего компонента.
источник
Вы также можете сделать что-то вроде этого ..
источник