Chciałbym niektóre zmienne mają być dostępne wszędzie w sposób Angular 2
w Typescript
języku. Jak mam się do tego zabrać?
typescript
angular
supercobra
źródło
źródło
Uncaught ReferenceError: Settings is not defined
. KlasaSettings
z publicznymi zmiennymi statycznymi jest ustawiona na eksport i została zaimportowana tam, gdzie była używana.Odpowiedzi:
O to najprostsze rozwiązanie w / o
Service
nieObserver
:Umieść zmienne globalne w pliku i wyeksportuj je.
Aby użyć globals w innym pliku, użyj
import
instrukcji:import * as myGlobals from 'globals';
Przykład:
Dzięki @ eric-martinez
źródło
import * as globs from 'globals'
export const
zamiastexport var
- Naprawdę chcesz się upewnić, te zmienne globalne nie mogą być zmienianeimport * as myGlobals from 'globals'
import * as myGlobals from './path/to/globals';
Podoba mi się też rozwiązanie z @supercobra. Chciałbym tylko trochę to poprawić. Jeśli eksportujesz obiekt, który zawiera wszystkie stałe, możesz po prostu zaimportować moduł za pomocą es6 bez użycia wymagania .
Użyłem również Object.freeze, aby właściwości stały się prawdziwymi stałymi. Jeśli jesteś zainteresowany tematem, możesz przeczytać ten post .
Skorzystaj z modułu za pomocą importu.
źródło
Wspólna usługa to najlepsze podejście
Ale musisz być bardzo ostrożny podczas rejestracji, aby móc współużytkować jedną instancję dla całej aplikacji. Musisz to zdefiniować podczas rejestracji aplikacji:
ale nie po to, aby zdefiniować go ponownie w
providers
atrybutach komponentów:W przeciwnym razie dla komponentu i jego składników podrzędnych zostanie utworzone nowe wystąpienie usługi.
Możesz rzucić okiem na to pytanie dotyczące działania iniekcji zależności i hierarchicznych wtryskiwaczy w Angular2:
Możesz zauważyć, że możesz również zdefiniować
Observable
właściwości w usłudze, aby powiadomić części aplikacji o zmianie właściwości globalnych:Zobacz to pytanie, aby uzyskać więcej informacji:
źródło
HTTP_PROVIDERS
podobnymi, czy też nie powinno się ich dodawaćbootstrap()
?bootstrap()
ale w praktyce nie ma to znaczenia. Myślę, że umieszczenie ich naboostrap()
liście ułatwia zrozumienie kodu. Komponent ma dostawców, dyrektywy, szablon. Uważam, że jest to przeciążone bez globalnych dostawców tam również. Dlatego wolębootstrap()
.alert(globalVar)
skutkuje błędem.Zobacz na przykład Angular 2 - Implementacja usług wspólnych
lub podaj indywidualne wartości
źródło
bootstrap()
.bootstrap()
a składnik główny to dwie różne rzeczy. Kiedy dzwoniszbootstrap(AppComponent, [MyService])
, rejestrujesz usługęboostrap()
i jesteśAppComponent
głównym komponentem. Dokumentacja wspomina gdzieś, że preferowane jest rejestrowanie dostawców (usług) w komponentach głównych,providers: ['MyService']
ale nie znalazłem jeszcze żadnego argumentu za lub przeciwbootstrap()
lub komponent root.Utwórz klasę Globals w app / globals.ts :
W twoim komponencie:
Uwaga : Możesz dodać dostawcę usług Globals bezpośrednio do modułu zamiast komponentu i nie musisz dodawać jako dostawcy do każdego komponentu w tym module.
źródło
Globals
z dodaniem jej doproviders: [ ... ]
oznacza, że nie można zmienić wartości w jednym komponencie, a następnie poprosić o zaktualizowaną wartość w drugim komponencie. Za każdym razem,Globals
gdy wstrzykujesz , jest to nowa instancja. Jeśli chcesz zmienić to zachowanie, po prostu NIE dodawajGlobals
jako dostawcy.@Injectable()
IMHO dla Angular2 (v2.2.3) najlepszym sposobem jest dodanie usług, które zawierają zmienną globalną i wstrzyknięcie ich do komponentów bez
providers
tagu wewnątrz@Component
adnotacji. W ten sposób możesz wymieniać informacje między komponentami.Przykładowa usługa, która jest właścicielem zmiennej globalnej:
Przykładowy składnik aktualizujący wartość zmiennej globalnej:
Przykładowy składnik odczytujący wartość zmiennej globalnej:
źródło
Unhandled Promise rejection: No provider for SomeSharedService
providers: [SomeSharedService]
w pliku modułu nadrzędnego. Dzięki.Nie znam najlepszego sposobu, ale najłatwiejszym sposobem, jeśli chcesz zdefiniować zmienną globalną wewnątrz komponentu, jest użycie
window
zmiennej do napisania w ten sposób:window.GlobalVariable = "what ever!"
nie musisz go przekazywać do ładowania początkowego lub importować w inne miejsca, i jest on dostępny globalnie dla wszystkich JS (nie tylko komponentów angular 2).
źródło
Tak go używam:
global.ts
aby go użyć, po prostu zaimportuj w ten sposób:
EDYTOWANE: Usunięto przedrostek „_” zgodnie z zaleceniami.
źródło
Myślę, że najlepszym sposobem jest udostępnienie obiektu zmiennym globalnym w całej aplikacji poprzez eksportowanie i importowanie go tam, gdzie chcesz.
Najpierw utwórz nowy plik .ts , na przykład globals.ts i zadeklaruj obiekt. Nadałem mu typ obiektu, ale możesz też użyć dowolnego typu lub {}
Następnie zaimportuj go
I użyj go
źródło
Podoba mi się odpowiedź @supercobra, ale użyłbym słowa kluczowego const, które jest już dostępne w ES6:
źródło