Angular — useFactory — вызовы функций ошибок не поддерживаются. Рассмотрите возможность замены функции или лямбды ссылкой на экспортированную функцию.

Я использую компилятор Angular AOT версии 4.1.3.

У меня есть библиотека компонентов, которая экспортирует фабричный метод, который затем используется для предоставления услуги:

export function libServiceFactory(itemId: string) {
  return (http: Http): LibService => {
    return new LibService(http, itemId);
  };
};

Я успешно скомпилировал библиотеку с помощью ngc.

Затем импортируйте скомпилированную библиотеку, и я использую LibServiceFactory в AppModule веб-сайта:

providers: [
  { provide: SERVICE_TOKEN, useFactory: libServiceFactory('foo'), deps: [Http] }
],

Я компилирую веб-сайт с помощью ng build и получаю следующую ошибку:

ERROR in Error encountered resolving symbol values statically. Function calls are not supported. Consider replacing the function or lambda with a reference to an exported function (position 5:10 in the
original .ts file), resolving symbol libServiceFactory in C:/Projects/MyProject/code/MyWebsite/node_modules/@mylibrary/service.factory.d.ts, res
olving symbol AppModule in C:/Projects/MyProject/code/MyWebsite/src/app/app.module.ts, resolving symbol AppModule in C:/Projects/MyProject/code/MyWebsite/src/app/app.mod
ule.ts, resolving symbol AppModule in C:/Projects/MyProject/code/MyWebsite/src/app/app.module.ts

Ошибка (position 5:10 in the original .ts file) указывает на анонимную функцию из фабричного метода: return (http: Http): LibService => {

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

Является ли моя ошибка ожидаемым поведением? Или что-то не так в моей реализации?


person nest    schedule 28.06.2017    source источник
comment
вы нашли какое-нибудь решение?   -  person Gauthier Peel    schedule 27.03.2018


Ответы (1)


Вы не можете выполнять код внутри декораторов метаданных (@Sth). Поэтому у вас нет прав на выполнение функции libServiceFactory('foo').

Если вы хотите иметь фабрику (и некоторую инъекцию службы, например, для получения службы HttpClient), И в то же время укажите некоторые параметрыb («foo» в вашем случае). Вы должны использовать следующий трюк:

export const MyLibConfig = new InjectionToken<MyConfig>('MyLibConfig');

export interface MyConfig {
  p: number;
  msg: string;
}

export function serviceFactory(myConfig: MyConfig, http: HttpClient): MyService {
  const service = new MyService(http);
  service.myConfig = myConfig;
  return service;
}

то вы можете использовать:

      providers: [
        {
          provide: MyService,
          useFactory: serviceFactory,
          deps: [MyLibConfig, HttpClient]
        },
        {
          provide: MyLibConfig,
          useValue: {p:3, msg:'foo'}
        }
      ]
person Gauthier Peel    schedule 31.03.2018