2016-10-13 4 views
4

Есть ли способ условно изменить импорт на основе переменной окружения в [email protected]? Я пытаюсь сделать это таким образом, чтобы не требовать изменений кода в том, как услуги импортируются в код клиента, но при необходимости я могу указать флаг сборки для обмена в макетных сервисах.angular-cli: Условный импорт с использованием переменной окружения

Существует закономерность, я попытался с помощью из this post: структура

Файл:

MyService 
    MyServiceMock.ts 
    MyServiceReal.ts 
    index.ts 

И в ваших index.ts, вы можете иметь следующее:

import { environment} from '../environments/environment'; 

export const MyService = environment.mock ? 
    require('./MyServiceMock').MyServiceMock: 
    require('./MyServiceReal').MyServiceReal; 

И в коде клиента, импорт MyService:

import MyService from './myservice/index'; 

страница загружается, и я могу видеть зависимость получать инъекции при пошаговом через код, однако есть ошибки компиляции (которые я считаю, являются машинопись ошибки) по линиям Cannot find name 'MyService'.

ответ

7

Вы собираетесь об этом совершенно неправильно. Угловой может обрабатывать этот случай использования с использованием заводов при настройке providers

providers: [ 
    Any, 
    Dependencies 
    { 
    provide: MyService, 
    useFactory: (any: Any, dependencies: Dependencies) => { 
     if (environment.production) { 
     return new MyService(any, dependencies); 
     } else { 
     return new MockMyService(any, dependencies); 
     } 
    }, 
    deps: [ Any, Dependencies ] 
] 

Теперь вы можете просто вводить MyService везде из-за provide: MyService, но в процессе развития, вы получите издеваться, и в производстве вы получите реальный сервис.

Смотрите также:

+2

Этот подход работает хорошо, но имеет недостаток, что макеты услуг включены в производственный пакет – ENargit

+0

Как именно я вставляю поставщика, когда он создан таким образом? Обычно я импортирую из файла, в котором работает служба, но в этом случае он может быть одним из двух файлов. Как сообщить Angular Я хочу, чтобы провайдер предоставлял фабричную функцию? – Valevalorin

+0

@ Валевалорин по токену ('обеспечить'), который является' MyService'. Это то, что вы вводите. –

0

Изменить импорт MyService на:

import { MyService } from './myservice/index';

Окружающая среда {} сообщит компилятору, что импортирует один экспорт из файла. Если вы хотите, чтобы иметь возможность импортировать как:

import MyService from './myservice/index';

Тогда вы должны экспортировать по умолчанию в index.ts: например

export default MyService;.

Более подробную информацию о машинопись модулей можно найти здесь: https://www.typescriptlang.org/docs/handbook/modules.html

+0

Спасибо за идею. Я все равно сталкиваюсь с той же ошибкой, но с «Не могу найти имя« MyService ». Также можно отметить: статический анализ машинописного текста в VS Code echos та же ошибка, указывающий на то, что импорт разрешается, но при попытке выполнить инъекцию зависимостей в конструкторе он не разрешает имя. –

Смежные вопросы