Подтвердить что ты не робот

Угловые 4/5/6 глобальные переменные

Я действительно борется с созданием глобальных переменных в моем приложении Angular 2.

Я уже googled и прочитал много сообщений в StackOverflow об этом в течение последних 3 часов, однако кажется, что я просто не могу заставить его работать. Я действительно надеюсь, что вы можете мне помочь, и я приношу свои извинения за задание этого вопроса.

Итак, у меня есть файл с именем globals.ts, который выглядит так:

import { Injectable } from "@angular/core";


@Injectable()
export class Globals {

  var role = 'test';

}

И я хочу использовать роль переменной в своем HTML-представлении моего компонента следующим образом:

{{ role }} 

Я уже добавил файл globals.ts в свой app.module.ts следующим образом:

providers: [
  Globals
],

Независимо от того, что я сделал в этом файле, это просто не сработало. То, что я не хочу делать, - это импортировать файл globals.ts в каждый компонент вручную, поэтому я хочу использовать функцию поставщиков.

Я действительно надеюсь, что ты сможешь помочь мне и снова пожалеть.

С уважением,

A E

4b9b3361

Ответ 1

Вы можете получить доступ к сущности Globals из любой точки вашего приложения с помощью внедрения angular зависимости. Если вы хотите вывести значение Globals.role в некотором шаблоне компонента, вы должны внедрить Globals через конструктор компонента, как и любой сервис:

// hello.component.ts
import { Component } from '@angular/core';
import { Globals } from './globals';

@Component({
  selector: 'hello',
  template: 'The global role is {{globals.role}}',
  providers: [ Globals ] // this depends on situation, see below
})

export class HelloComponent {
  constructor(public globals: Globals) {}
}

Я предоставил Globals в HelloComponent, но вместо этого он мог быть предоставлен в некотором родительском компоненте HelloComponent или даже в AppModule. Это не будет иметь значения, пока ваш Globals не будет иметь только статические данные, которые нельзя изменить (скажем, только константы). Но если это не так и, например, различные компоненты/службы могут захотеть изменить эти данные, то Globals должен быть одноэлементным. В этом случае он должен быть предоставлен на самом верхнем уровне иерархии, где он будет использоваться. Допустим, это AppModule:

import { Globals } from './globals'

@NgModule({
  // ... imports, declarations etc
  providers: [
    // ... other global providers
    Globals // so do not provide it into another components/services if you want it to be a singleton
  ]
})

Кроме того, невозможно использовать var, как вы это сделали, это должно быть

// globals.ts
import { Injectable } from '@angular/core';

@Injectable()
export class Globals {
  role: string = 'test';
}

Обновление

Наконец, я создал простую демонстрацию по stackblitz, где один Globals распределяется между 3 компонентами, и один из них может изменить значение Globals.role.

Ответ 2

Я использую среду для этого. Он работает автоматически, и вам не нужно создавать новый сервис для инъекций, и он наиболее полезен для меня, не нужно импортировать через конструктор.

1) Создайте переменную окружения в вашей среде.

export const environment = {
    ...
    // runtime variables
    isContentLoading: false,
    isDeployNeeded: false
}

2) Импортируйте environment.ts в файл *.ts и создайте открытую переменную (т.е. "Env") для использования в шаблоне html.

import { environment } from 'environments/environment';

@Component(...)
export class TestComponent {
    ...
    env = environment;
}

3) Используйте это в шаблоне...

<app-spinner *ngIf='env.isContentLoading'></app-spinner>

в *.ts...

env.isContentLoading = false 

(или просто environment.isContentLoading, если он вам не нужен для шаблона)


Вы можете создать свой собственный набор глобалов в среде environment.ts следующим образом:

export const globals = {
    isContentLoading: false,
    isDeployNeeded: false
}

и импортировать напрямую эти переменные (у)

Ответ 3

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

Index.html

<body>
  <app-root></app-root>
  <script>
    myTest = 1;
  </script>
</body>

Компонент или что-нибудь еще в Angular

... рядом с правым верхним краем после импорта:

declare const myTest: any;

... позже:

console.warn(myTest); // outputs '1'