Angular 注入服务与注入服务

Angular 注入服务与注入服务,angular,typescript,Angular,Typescript,你好,我不明白为什么注射不正确。它抛出以下错误: 无法读取未定义的属性“productService” 在ProductValidator.validateCodeUnique(ProductValidator.ts:23) 我在模块的提供程序中声明了两个: providers: [ProductService, ProductValidator] 我从另一个模式窗口调用Validator: export class AddDialogComponent { code = new FormCo

你好,我不明白为什么注射不正确。它抛出以下错误:
无法读取未定义的属性“productService” 在ProductValidator.validateCodeUnique(ProductValidator.ts:23)

我在模块的提供程序中声明了两个:

providers: [ProductService, ProductValidator]
我从另一个模式窗口调用Validator:

export class AddDialogComponent {
code = new FormControl('', [this.productValidator.validateCodeLength, this.productValidator.validateCodeUnique]);

constructor(public dataService: ProductService,
    public productValidator: ProductValidator)
...
}

validateDeleteLength
工作正常,有人知道为什么不注入ProductService吗?我正在另一个组件中注入ProductService,它工作得非常好。不知道我在这里遗漏了什么

我复制了您的错误,实际上,每次需要访问验证函数时,您都必须将上下文变量绑定到它(即变量)

我总是使用
myValidationFunction.bind(this)
来绑定这些案例,因为验证函数总是在创建FormControl组件中声明,但您的案例是特定的

为了让您的代码运行,我必须:

this.productValidator.validateCodeUnique.bind(this.productValidator) 
这是因为您不希望上下文变量This(在验证函数中)成为AddDialogComponent的实例。在创建FormControl时,您实际上希望它是ProductValidator实例


希望有帮助。

您试图向验证程序提供类的成员函数,但当验证程序函数执行此操作或上下文对象发生更改时。。。为了避免这种情况,您可以使用高阶函数或闭包方式通过
this.productValidator.ValidateDeleteLength
替换
this.productValidator.ValidateDeleteLength.bind(this)
control=>this.productValidator.ValidateDeleteLength(control)
。(当然,另一个也一样)谢谢你们,我明白了!:)
export class AddDialogComponent {
code = new FormControl('', [this.productValidator.validateCodeLength, this.productValidator.validateCodeUnique]);

constructor(public dataService: ProductService,
    public productValidator: ProductValidator)
...
}
this.productValidator.validateCodeUnique.bind(this.productValidator)