Angular DI 类类型:类型<MyClass> 不是构造函数
Angular DI classType: Type<MyClass> is not a constructor
所以我尝试在 ngOnInit 中使用 angular 依赖注入而不是构造函数。
我使用工厂提供程序找到了一些这样的例子,但事情不太奏效...
我得到了对
的引用
let myClassType: Type<MyClass> = ....
我可以使用
实例化自己的对象
let myClassInstance = new myClassType(http)
但是当我尝试设置 DI 以允许我使用 DI 时,我似乎失败了......
出于某种原因,我在控制台中收到错误消息,指出 myClassFactory 函数 return 行上的 myClassType 不是构造函数,但由于可以使用相同的代码手动创建实例 elseware...
在我的组件上,我使用了这个构造函数:
constructor(@Inject(MyClass) private _myClassFactory: (myClassType: Type<MyClass>) => MyClass
我的理解是这种模式在组件 ngOnInit 中应该是可能的:
let myClassInstance: MyClass = this._myClassFactory(myClassType);
我的模型有这个:
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
HttpClientModule,
AppRoutingModule
],
providers: [
myClassProvider
],
bootstrap: [ AppComponent ]
})
我的 MyClass.ts 看起来像这样:
@Injectable()
export abstract class MyClass {
constructor(http: HttpClient) {}
}
export function myClassFactory(myClassType: Type<MyClass>, http: HttpClient): MyClass {
return new myClassType(http);
};
export let myClassProvider = {
provide: MyClass,
useFactory: myClassFactory,
deps: [HttpClient]
};
我想做这个不寻常的模式的原因是因为我希望能够使用从 http 调用传递的参数创建 MyClass 的实例,因此它们在创建组件时不可用。我尽可能地简化了示例。
气死我了...原来是犯了一个小错误,震惊.....
我通过替换它来让它工作:
export function myClassFactory(http: HttpClient, myClassType: Type<MyClass>): MyClass {
return new myClassType(http);
};
export let myClassProvider: Provider = {
provide: MyClass,
useFactory: myClassFactory,
deps: [HttpClient]
};
有了这个:
export let myClassProvider: Provider = {
provide: MyClass,
useFactory: (http: HttpClient) => (myClassType: Type<MyClass>) => new myClassType(http),
deps: [ HttpClient ]
};
起初我没有看出区别,但注意到第一次尝试将 useFactory 设置为一个带有两个参数的函数...
第二次尝试将 useFactory 设置为一个接受一个参数的函数,其中该函数 returns 一个也接受一个参数的新函数!
好像是因为js中参数是可选的(angular翻译成js)所以DI在启动时调用了provider函数,但是因为没有加参数所以只有http引用。这意味着变量 myClassType 是未定义的,当然这不会作为构造函数!
所以我尝试在 ngOnInit 中使用 angular 依赖注入而不是构造函数。 我使用工厂提供程序找到了一些这样的例子,但事情不太奏效...
我得到了对
的引用let myClassType: Type<MyClass> = ....
我可以使用
实例化自己的对象let myClassInstance = new myClassType(http)
但是当我尝试设置 DI 以允许我使用 DI 时,我似乎失败了...... 出于某种原因,我在控制台中收到错误消息,指出 myClassFactory 函数 return 行上的 myClassType 不是构造函数,但由于可以使用相同的代码手动创建实例 elseware...
在我的组件上,我使用了这个构造函数:
constructor(@Inject(MyClass) private _myClassFactory: (myClassType: Type<MyClass>) => MyClass
我的理解是这种模式在组件 ngOnInit 中应该是可能的:
let myClassInstance: MyClass = this._myClassFactory(myClassType);
我的模型有这个:
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
HttpClientModule,
AppRoutingModule
],
providers: [
myClassProvider
],
bootstrap: [ AppComponent ]
})
我的 MyClass.ts 看起来像这样:
@Injectable()
export abstract class MyClass {
constructor(http: HttpClient) {}
}
export function myClassFactory(myClassType: Type<MyClass>, http: HttpClient): MyClass {
return new myClassType(http);
};
export let myClassProvider = {
provide: MyClass,
useFactory: myClassFactory,
deps: [HttpClient]
};
我想做这个不寻常的模式的原因是因为我希望能够使用从 http 调用传递的参数创建 MyClass 的实例,因此它们在创建组件时不可用。我尽可能地简化了示例。
气死我了...原来是犯了一个小错误,震惊..... 我通过替换它来让它工作:
export function myClassFactory(http: HttpClient, myClassType: Type<MyClass>): MyClass {
return new myClassType(http);
};
export let myClassProvider: Provider = {
provide: MyClass,
useFactory: myClassFactory,
deps: [HttpClient]
};
有了这个:
export let myClassProvider: Provider = {
provide: MyClass,
useFactory: (http: HttpClient) => (myClassType: Type<MyClass>) => new myClassType(http),
deps: [ HttpClient ]
};
起初我没有看出区别,但注意到第一次尝试将 useFactory 设置为一个带有两个参数的函数... 第二次尝试将 useFactory 设置为一个接受一个参数的函数,其中该函数 returns 一个也接受一个参数的新函数!
好像是因为js中参数是可选的(angular翻译成js)所以DI在启动时调用了provider函数,但是因为没有加参数所以只有http引用。这意味着变量 myClassType 是未定义的,当然这不会作为构造函数!