Почему angular не позволяет мне передавать параметр в функцию useFactory провайдера? - PullRequest
2 голосов
/ 05 июля 2019

app.module.ts

   bootstrap: [AppComponent],
      declarations: [AppComponent],
      imports: [
        CoreModule,
        HelloFrameworkModule,
      ],
      providers: [{
        provide: Logger,
        useFactory: loggerProviderFunc(1),

      }]
    })

app.component.ts

@Component({
  selector: 'my-app',
  styleUrls: ['./app.component.scss'],
  templateUrl: './app.component.html',
})
export class AppComponent {
   constructor(private c:Logger){ 
   }
}

logger.ts

export class Logger {
  constructor(private msg: string) {
     console.log(this.msg);
  } 
}

Ошибка: ОШИБКА TypeError: фабрика не является функцией на _callFactory

Я получаю 1 как переданное значение в консоли, но я также получаю ошибки сразу после него. Однако я получаю ноль ошибок в консоли, если я просто удаляю параметр, т.е. меняю loggerProviderFunc(1) на loggerProviderFunc

1 Ответ

1 голос
/ 05 июля 2019

Поле provideFactory: требует функции, а не результата вызова функции.

Если вы хотите использовать его с аргументом, вы можете использовать выражение стрелки:

bootstrap: [AppComponent],
  declarations: [AppComponent],
  imports: [
    CoreModule,
    HelloFrameworkModule,
  ],
  providers: [{
    provide: Logger,
    useFactory: () = > loggerProviderFunc(1),
  }]
})

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

bootstrap: [AppComponent],
  declarations: [AppComponent],
  imports: [
    CoreModule,
    HelloFrameworkModule,
  ],
  providers: [{
    provide: Logger,
    useValue: loggerProviderFunc(1)
  }]
})
...