2016-10-24 7 views

Odpowiedz

5

Zakładając, że masz jakiś rodzaj "przełącznika", niezależnie od tego, czy jest to Angular CLI environment do węzła ENV, możesz po prostu zmienić, który z nich powinien być użyty XHRBackend. in-memory-web-api używa własnego zaplecza administracyjnego InMemoryBackendService. Więc można zrobić coś takiego

import { NgModule, Injector } from '@angular/core'; 
import { HttpModule, XHRBackend, BrowserXhr, 
     ResponseOptions, XSRFStrategy } from '@angular/http'; 

import { InMemoryBackendService, InMemoryDbService } from 'angular-in-memory-web-api'; 

let environment = { 
    production: true 
}; 

export class MockData implements InMemoryDbService { 
    createDb() { 
    let cats = [ 
     { id: 1, name: 'Fluffy' } 
    ]; 
    return { cats }; 
    } 
} 

@NgModule({ 
    imports: [ HttpModule ], 
    providers: [ 
    { 
     provide: XHRBackend, 
     useFactory: (injector: Injector, browser: BrowserXhr, 
        xsrf: XSRFStrategy, options: ResponseOptions): any => { 
     if (environment.production) { 
      return new XHRBackend(browser, options, xsrf); 
     } else { 
      return new InMemoryBackendService(injector, new MockData(), { 
      // the configuration object 
      }); 
     } 
     }, 
     deps: [ Injector, BrowserXhr, XSRFStrategy, ResponseOptions ] 
    } 
    ] 
}) 
export class AppHttpModule { 
} 

Tutaj jesteśmy importowania HttpModule, a następnie tworząc zależność XHRBackend dynamicznie. W środowisku programistycznym będzie korzystać z usługi backendu, co w rzeczywistości dzieje się, gdy używamy modelu InMemoryWebApiModule. Dlatego zamiast korzystać z tego modułu, sami konfigurujemy usługę backendu. W środowisku produkcyjnym po prostu używa tego samego XHRBackend, który normalnie byłby używany.

Zwróć także uwagę na environment. To tylko przykład. To prawdopodobnie nie będzie używane przez ciebie. Idealnie, środowisko powinno być czymś, co jest sterowane z linii poleceń. W przypadku Angular CLI, w rzeczywistości zapewnia on zmienną environment znajdującą się w environment/environment. Środowisko automatycznie przełącza się za pomocą interfejsu CLI w kompilacji produkcyjnej.

Jeśli nie korzystasz z interfejsu CLI, możesz prawdopodobnie użyć węzła ENV lub w inny sposób zaplanować przełączanie produkcji. Chodzi o to, że użyty powyżej environment jest tylko przykładem. Idealnie nie jest to coś, co chcesz ręcznie zmienić. Twój projekt powinien mieć jakiś sposób, aby określić kompilację produkcji, i która powinna być dostępna w twoim kodzie.

Również z powyższym AppHttpModule, nie trzeba już importować HttpModule do swojej AppModule, tylko importować AppHttpModule

+0

To jest świetny przykład. Naprawdę pomaga mi to uprościć. Nie śledzę tego, co robi argument przeglądarki. – Winnemucca

+1

@ Winnemucca Są to wszystkie zależności wymagane dla XHRBackend. Być może nie wiesz, do czego służy, ale jest to wymagane. Po prostu spojrzałem na źródło XHRBackend i zobaczyłem, że to wymaga, więc dodałem to jako zależność. To samo dotyczy opcji ResponseOptions i XSRFStrategy. Nie mogę powiedzieć dokładnie, do czego używa ich backend, ale jeśli jesteś ciekawy, spójrz na kod źródłowy zaplecza. Nie tylko to wymyśliłem. Backend wymaga tych rzeczy, niezależnie od tego, czy je tworzymy, czy też Angular. –

+0

https://github.com/angular/angular/tree/master/packages/http/src/backends –

2

To proste podejście działa dla mnie:

const ENV = 'prod'; // your global ENV variable; 
 
----- 
 

 
@NgModule({ 
 
    imports: [ 
 
    ... 
 
    HttpModule, 
 
    ENV !== 'prod' ? InMemoryWebApiModule.forRoot(DataMockService) : [], 
 
    ], 
 
    ... 
 
}) 
 
export class AppModule {}

1

Ten sam sposób:

import { environment } from './app.constants'; 
let myTestApiModule = []; 
if (!environment.production) { 
    myTestApiModule.push(InMemoryWebApiModule.forRoot(InMemDataService, 
    { delay: 500 }) 
    ); 
} 

imports: [ 
    CommonModule, 
    SharedModule, 
    ...myTestApiModule, 
], 
+0

Do czego służy '{delay: 500}'? –

+0

To opóźnienie dla api połączeń. Na przykład robię http.get (...), a otrzymam wynik po pauzie w 500 ms. Po prostu sztuczne opóźnienie emulacji prawdziwego serwera lub złej sieci i zachowanie testowe twojego asynchronicznego kodu. –