代码之家  ›  专栏  ›  技术社区  ›  minizibi

注入服务与注入服务

  •  1
  • minizibi  · 技术社区  · 7 年前

    你好,我不明白为什么注射不当。它引发此错误:
    无法读取未定义的“ProductService”属性 在product validator.validatecodeunique(product validator.ts:23)

    @Injectable()
    export class ProductValidator {
    
      constructor(public productService: ProductService) { }
    
      validateCodeUnique(input: FormControl) {
        const code: string = input.value;
        let isUnique = true;
        this.productService.getAllProducts().forEach((product, key) => {
          if (product.code === code) {
            isUnique = false;
          }
        });
        return isUnique ? null : { notValid: true };
      }
    }
     validateCodeLength(input: FormControl) {
        const codeLength: number = input.value.length;
        const hasIncorrectLength = codeLength < 1 || codeLength > 10;
        return hasIncorrectLength ? null : { notValid: true };
      }
    

    ProductService还注释为 Injectable 以下内容:

    @Injectable()
    export class ProductService {
    ...
    }
    

    我在模块的提供者中声明了:

    providers: [ProductService, ProductValidator]
    

    我从另一个模式窗口调用验证器:

    export class AddDialogComponent {
    code = new FormControl('', [this.productValidator.validateCodeLength, this.productValidator.validateCodeUnique]);
    
    constructor(public dataService: ProductService,
        public productValidator: ProductValidator)
    ...
    }
    

    validateCodeLength 工作正常,有人知道为什么没有注入ProductService吗?我在另一个组件中注入ProductService,它工作得很好。不知道我在这里错过了什么

    1 回复  |  直到 7 年前
        1
  •  1
  •   Nandolcs    7 年前

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

    我总是 myValidationFunction.bind(this) 因为验证函数总是声明在同一个 组件 那个 窗体控件 正在创建,但您的案例是特定的。

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

    this.productValidator.validateCodeUnique.bind(this.productValidator) 
    

    这是因为您不需要上下文变量 (在验证函数内)作为 添加对话框组件 你创造的地方 窗体控件 你真的希望它是一个 产品验证程序 实例。

    希望有帮助。

    推荐文章