Javascript 为什么赢了';t允许我将参数传递给提供程序中的函数';什么是旧工厂?

Javascript 为什么赢了';t允许我将参数传递给提供程序中的函数';什么是旧工厂?,javascript,angular,typescript,dependency-injection,angular5,Javascript,Angular,Typescript,Dependency Injection,Angular5,应用程序模块.ts bootstrap: [AppComponent], declarations: [AppComponent], imports: [ CoreModule, HelloFrameworkModule, ], providers: [{ provide: Logger, useFactory: loggerProviderFunc(1), }]

应用程序模块.ts

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

      }]
    })
@Component({
  selector: 'my-app',
  styleUrls: ['./app.component.scss'],
  templateUrl: './app.component.html',
})
export class AppComponent {
   constructor(private c:Logger){ 
   }
}
export class Logger {
  constructor(private msg: string) {
     console.log(this.msg);
  } 
}
应用程序组件.ts

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

      }]
    })
@Component({
  selector: 'my-app',
  styleUrls: ['./app.component.scss'],
  templateUrl: './app.component.html',
})
export class AppComponent {
   constructor(private c:Logger){ 
   }
}
export class Logger {
  constructor(private msg: string) {
     console.log(this.msg);
  } 
}
logger.ts

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

      }]
    })
@Component({
  selector: 'my-app',
  styleUrls: ['./app.component.scss'],
  templateUrl: './app.component.html',
})
export class AppComponent {
   constructor(private c:Logger){ 
   }
}
export class Logger {
  constructor(private msg: string) {
     console.log(this.msg);
  } 
}
错误:错误类型错误:工厂不是函数 在callFactory


我在控制台中得到1作为传递的值,但在它之后我也得到了错误。但是,如果只删除参数,即将
loggerProviderFunc(1)
更改为
loggerProviderFunc

providerfactory:
字段需要函数,而不是调用函数的结果,则控制台中不会出现任何错误

如果希望将其用于参数,可以使用箭头表达式:

bootstrap: [AppComponent],
  declarations: [AppComponent],
  imports: [
    CoreModule,
    HelloFrameworkModule,
  ],
  providers: [{
    provide: Logger,
    useFactory: () = > loggerProviderFunc(1),
  }]
})
也许Angular还允许调用
useValue:
的函数,但这一点我还没有测试过。如果这样做有效,请注意,它将只被调用一次,而解析程序每次执行解析工作时都会调用factory方法

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

如果这样做有效,请注意它只会被调用一次,而每次解析程序执行解析工作时都会调用factory方法。
这是有用的信息。非常感谢,我现在明白了。顺便说一句,useValue确实有效。我已经试过了。@SamuraiJack不客气,谢谢你对
useValue
的反馈。