Я хотел бы, чтобы некоторые переменные были доступны везде Angular 2
на Typescript
языке. Как мне это сделать?
typescript
angular
supercobra
источник
источник
Uncaught ReferenceError: Settings is not defined
. КлассSettings
с открытыми статическими переменными настроен на экспорт и импортирован там, где он использовался.Ответы:
Вот самое простое решение ж / о ,
Service
ниObserver
:Поместите глобальные переменные в файл и экспортируйте их.
Чтобы использовать глобалы в другом файле, используйте
import
оператор:import * as myGlobals from 'globals';
Пример:
Спасибо @ Эрик-Мартинес
источник
import * as globs from 'globals'
export const
вместоexport var
- вы действительно хотите убедиться, что эти глобальные переменные не могут быть измененыimport * as myGlobals from 'globals'
import * as myGlobals from './path/to/globals';
Мне тоже нравится решение от @supercobra. Я просто хотел бы немного улучшить его. Если вы экспортируете объект, который содержит все константы, вы можете просто использовать es6 для импорта модуля без использования require .
Я также использовал Object.freeze, чтобы свойства стали настоящими константами. Если вы заинтересованы в этой теме, вы можете прочитать этот пост .
Обратитесь к модулю, используя импорт.
источник
Общий сервис - лучший подход
Но вы должны быть очень осторожны при регистрации, чтобы иметь возможность поделиться одним экземпляром для всего вашего приложения. Вы должны определить это при регистрации вашего приложения:
но не определять его снова в
providers
атрибутах ваших компонентов:В противном случае будет создан новый экземпляр вашего сервиса для компонента и его подкомпонентов.
Вы можете взглянуть на этот вопрос относительно того, как в Angular2 работают внедрение зависимостей и иерархические инжекторы:
Вы также можете заметить, что вы также можете определить
Observable
свойства в сервисе, чтобы уведомлять части вашего приложения об изменении ваших глобальных свойств:Смотрите этот вопрос для более подробной информации:
источник
HTTP_PROVIDERS
и тому подобное, к ним также нельзя добавитьbootstrap()
?bootstrap()
но на практике это не имеет значения. Я думаю, что перечисление их вboostrap()
делает код легче для понимания. У компонента есть поставщики, директивы, шаблон. Я нахожу это перегруженным без перечисленных там глобальных провайдеров. Поэтому я предпочитаюbootstrap()
.alert(globalVar)
ошибку.См. Например, Angular 2 - Реализация общих служб
или предоставить индивидуальные значения
источник
bootstrap()
.bootstrap()
и корневой компонент - это две разные вещи. Когда вы звоните,bootstrap(AppComponent, [MyService])
вы регистрируете сервис вboostrap()
иAppComponent
является корневым компонентом. В документах где-то упоминается, что предпочтительно регистрировать провайдеров (сервис) в корневых компонентах,providers: ['MyService']
но я пока не нашел аргументов в пользу или противbootstrap()
или корневого компонента.Создайте класс Globals в app / globals.ts :
В вашем компоненте:
Примечание . Вы можете добавить поставщика услуг Globals непосредственно в модуль вместо компонента, и вам не нужно добавлять его в качестве поставщика для каждого компонента в этом модуле.
источник
Globals
с добавлением его такжеproviders: [ ... ]
означает, что вы не можете изменить значение внутри одного компонента, а затем запросить обновленное значение внутри второго компонента. Каждый раз, когда вы вводитеGlobals
это свежий экземпляр. Если вы хотите изменить это поведение, просто НЕ добавляйте вGlobals
качестве поставщика.@Injectable()
IMHO для Angular2 (v2.2.3) лучший способ - это добавить сервисы, которые содержат глобальную переменную, и внедрить их в компоненты без
providers
тега внутри@Component
аннотации. Таким образом, вы можете обмениваться информацией между компонентами.Пример сервиса, которому принадлежит глобальная переменная:
Пример компонента, который обновляет значение вашей глобальной переменной:
Пример компонента, который читает значение вашей глобальной переменной:
источник
Unhandled Promise rejection: No provider for SomeSharedService
providers: [SomeSharedService]
в файл родительского модуля. Спасибо.Я не знаю лучший способ, но самый простой способ, если вы хотите определить глобальную переменную внутри компонента, это использовать
window
переменную для записи следующим образом:window.GlobalVariable = "what ever!"
вам не нужно передавать его для начальной загрузки или импортировать его в другие места, и он доступен глобально для всех JS (не только для угловых 2 компонентов).
источник
Вот как я это использую:
global.ts
чтобы использовать его просто импортируйте так:
Отредактировано: добавлено префикс "_", как рекомендуется.
источник
Я думаю, что лучший способ - это поделиться объектом с глобальными переменными во всем приложении, экспортируя и импортируя его в нужное вам место.
Сначала создайте новый ts - файл для примера globals.ts и объявить объект. Я дал ему тип объекта, но вы также можете использовать любой тип или {}
После этого импортируйте его
И использовать это
источник
Мне нравится ответ @supercobra, но я бы использовал ключевое слово const, которое уже доступно в ES6:
источник