Angular сервис с зависимостью, которая имеет значение по умолчанию - ошибка сборки неизвестный идентификатор [] - PullRequest
0 голосов
/ 23 января 2020

Я создал сервис, подобный этому:

@Injectable({ providedIn: 'root' })
export class TestService {
  value: any;
  constructor(value: string = 'a') {
    this.value = value;
  }
}

Не удается создать с ng build -aot

ERROR in : Error: Internal error: unknown identifier []
    at Object.importExpr$$1 [as importExpr] (C:\MyProject\node_modules\@angular\compiler\bundles\compiler.umd.js:24170:27)
    at C:\MyProject\node_modules\@angular\compiler\bundles\compiler.umd.js:18100:37
    at Array.map (<anonymous>)
    at InjectableCompiler.depsArray (C:\MyProject\node_modules\@angular\compiler\bundles\compiler.umd.js:18066:25)
    at InjectableCompiler.factoryFor (C:\MyProject\node_modules\@angular\compiler\bundles\compiler.umd.js:18130:36)
    at InjectableCompiler.injectableDef (C:\MyProject\node_modules\@angular\compiler\bundles\compiler.umd.js:18149:44)
    at InjectableCompiler.compile (C:\MyProject\node_modules\@angular\compiler\bundles\compiler.umd.js:18159:106)
    at C:\MyProject\node_modules\@angular\compiler\bundles\compiler.umd.js:24015:90
    at Array.forEach (<anonymous>)
    at AotCompiler._emitPartialModule2 (C:\MyProject\node_modules\@angular\compiler\bundles\compiler.umd.js:24015:25)
    at C:\MyProject\node_modules\@angular\compiler\bundles\compiler.umd.js:24008:48
    at Array.reduce (<anonymous>)
    at AotCompiler.emitAllPartialModules2 (C:\MyProject\node_modules\@angular\compiler\bundles\compiler.umd.js:24007:26)
    at AngularCompilerProgram._emitRender2 (C:\MyProject\node_modules\@angular\compiler-cli\src\transformers\program.js:300:31)
    at AngularCompilerProgram.emit (C:\MyProject\node_modules\@angular\compiler-cli\src\transformers\program.js:201:22)
    at AngularCompilerPlugin._emit (C:\MyProject\node_modules\@ngtools\webpack\src\angular_compiler_plugin.js:879:49)

И предупреждение до этого:

Предупреждение. Не удалось разрешить все параметры для TestService в C: / MyProject / src / app / shared / context / test.service.ts: (?). Это станет ошибкой в ​​Angular v6.x

Странная вещь в этом предупреждении состоит в том, что на самом деле я использую Angular 7.2 , в то время как ошибка предупреждает меня что это будет проблемой в Angular 6 ...


Я нашел способ обойти это, изменив службу на использование заводской функции:

@Injectable({ providedIn: 'root', useFactory: () => new TestService('a') })
export class TestService {
  value: any;
  constructor(value: string) {
    this.value = value;
  }
}

Теперь это строится успешно, но предупреждающее сообщение остается. И я не уверен, что это правильный способ ее решения.

Как мне создать службу с зависимостью и указать для нее значение по умолчанию?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

Обходной путь из оригинального вопроса в порядке, а предупреждающие сообщения - это ошибка компилятора Angular. https://github.com/angular/angular/issues/34925#event -2975512691

Тем не менее, может быть лучше использовать токен DI. Примерно так:

export const TEST_TOKEN = new InjectionToken<string>('mytoken', {
  providedIn: 'root',
  factory: () => 'default value',
})

@Injectable({ providedIn: 'root' })
export class TestService {
  value: any;
  constructor(@Inject(TEST_TOKEN) value: string) {
    this.value = value;
  }
}

Таким образом, есть значение по умолчанию, которое можно изменить с помощью провайдеров DI Angular: {provide: TEST_TOKEN, useValue: 'some other value'}

Надеюсь, это поможет

0 голосов
/ 23 января 2020

Сервисы не должны содержать никаких параметров. Если вы решите построить его таким образом, вы не сможете использовать его в сценарии DI, и это вызовет проблемы в будущем. Мой совет - использовать метод setValue () publi c. и создайте переменную со значением по умолчанию.

...