【问题标题】:How to inject object that has constructor parameters in Angular?如何在Angular中注入具有构造函数参数的对象?
【发布时间】:2021-02-09 09:49:24
【问题描述】:

我非常喜欢 Angular,我想弄清楚如何将参数传递给正在注入组件的对象构造函数。

这是一个例子:

image-capture.service.ts

@Injectable({ providedIn: 'root'})
export class ImageCapture {

  constructor(
    private sdk: any,
    private videoSource: HTMLVideoElement,
    private cameraFeedback: HTMLCanvasElement) {}
}

image-scanner.component.ts

@Component({
  selector: 'app-document-scanner-component',
  templateUrl: './app-document-scanner-component.html',
  styleUrls: ['./app-document-scanner-component.scss'],
})
export class ImageScannerComponent {

  @ViewChild('video') video!: ElementRef<HTMLVideoElement>;
  @ViewChild('cameraFeedback') feedback!: ElementRef<HTMLCanvasElement>;

  constructor(private imageCaptureService: ImageCapture) { }

}

image-scanner. component 中,我需要传递给注入对象ImageCapture 几个构造函数参数,一个是正在导入的SDK 实例,第二个参数是我使用@ViewChild 装饰器获得的HTML DOM 元素。

我怎样才能做到这一点?

【问题讨论】:

    标签: angular dependency-injection angular-dependency-injection


    【解决方案1】:

    您不能将参数传递给服务的构造函数,因为您的服务是在加载应用程序时创建的。因此,当您在组件中使用服务时,该服务已经被实例化了。

    解决方案是在您的服务中创建一个函数:

    public initialize(sdk: any,videoSource: HTMLVideoElement,cameraFeedback: HTMLCanvasElement) {}
    

    那么你只需要在你的组件的构造函数中调用这个函数。

    【讨论】:

    • 好的,谢谢,但是提供商中的useFactory 是否解决了这个问题?哪里可以直接创建带参数的构造函数?
    • @Andrew 我认为您可以使用@Input 将对象传递给一个组件到另一个组件。
    • @Andrew useFactory 不会帮助你,因为你需要传递一些参数,这些参数在你的组件初始化(ViewChild)之后可用。当你直接在你的组件上提供服务时,你必须在'@Component'装饰器上做,所以你的组件的属性是不可用的。
    • @Soukyone 但除了 HTML 元素之外,如果我需要传递另一个对象是否可行?
    猜你喜欢
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    相关资源
    最近更新 更多