Blame view

src/app/app.module.ts 2.52 KB
05b0b5d8   Yarik   first commit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
  import { NgModule, ApplicationRef } from '@angular/core';
  import { BrowserModule } from '@angular/platform-browser';
  import { FormsModule, ReactiveFormsModule } from '@angular/forms';
  import { HttpModule } from '@angular/http';
  import { RouterModule } from '@angular/router';
  import { removeNgStyles, createNewHosts, createInputTransfer } from '@angularclass/hmr';
  
  /*
   * Platform and Environment providers/directives/pipes
   */
  import { ENV_PROVIDERS } from './environment';
  import { routing } from './app.routing';
  
  // App is our top level component
  import { App } from './app.component';
  import { AppState, InternalStateType } from './app.service';
  import { GlobalState } from './global.state';
  import { NgaModule } from './theme/nga.module';
  import { PagesModule } from './pages/pages.module';
  
  // Application wide providers
  const APP_PROVIDERS = [
    AppState,
    GlobalState
  ];
  
  export type StoreType = {
    state: InternalStateType,
    restoreInputValues: () => void,
    disposeOldHosts: () => void
  };
  
  /**
   * `AppModule` is the main entry point into Angular2's bootstraping process
   */
  @NgModule({
    bootstrap: [App],
    declarations: [
      App
    ],
    imports: [ // import Angular's modules
      BrowserModule,
      HttpModule,
      RouterModule,
      FormsModule,
      ReactiveFormsModule,
      NgaModule.forRoot(),
      PagesModule,
      routing
    ],
    providers: [ // expose our Services and Providers into Angular's dependency injection
      ENV_PROVIDERS,
      APP_PROVIDERS
    ]
  })
  
  export class AppModule {
  
    constructor(public appRef: ApplicationRef, public appState: AppState) {
    }
  
    hmrOnInit(store: StoreType) {
      if (!store || !store.state) return;
      console.log('HMR store', JSON.stringify(store, null, 2));
      // set state
      this.appState._state = store.state;
      // set input values
      if ('restoreInputValues' in store) {
        let restoreInputValues = store.restoreInputValues;
        setTimeout(restoreInputValues);
      }
      this.appRef.tick();
      delete store.state;
      delete store.restoreInputValues;
    }
  
    hmrOnDestroy(store: StoreType) {
      const cmpLocation = this.appRef.components.map(cmp => cmp.location.nativeElement);
      // save state
      const state = this.appState._state;
      store.state = state;
      // recreate root elements
      store.disposeOldHosts = createNewHosts(cmpLocation);
      // save input values
      store.restoreInputValues = createInputTransfer();
      // remove styles
      removeNgStyles();
    }
  
    hmrAfterDestroy(store: StoreType) {
      // display new elements
      store.disposeOldHosts();
      delete store.disposeOldHosts;
    }
  }