打字稿:调用带有隐式注入参数的构造函数

时间:2018-09-13 09:30:36

标签: typescript dependency-injection constructor angular5

如何以这种方式创建Point实例:

let npoint = new Point();

Point的构造函数需要一个参数(不同),应将其注入。

import { DoCheck, KeyValueDiffers, KeyValueDiffer } from '@angular/core';

export class GsPoint {

  uuid: string;

  differ: any;
  constructor(private differs: KeyValueDiffers) {
    this.differ = this.differs.find({}).create();
  }

  ngDoCheck() {
    const change = this.differ.diff(this);
    if (change) {
      change.forEachChangedItem(item => {
        console.log('item changed', item);
      });
    }
  }
}

1 个答案:

答案 0 :(得分:0)

如果它是一个普通类(不是组件或指令),那么您将无法像在组件级别或模块级别那样注入KeyValueDiffers服务。

1。)您需要

  • 将@Injectable()添加到GsPoint并

  • 在组件或NgModule中提供类似GsPoint的提供程序:[GsPoint]。

然后在某个位置注入GsPoint时,KeyValueDiffers实例在被DI实例化(第一次注入之前)时会传递给GsPoint。

2。)另一种方法是配置自定义注入器,例如

constructor(private injector:Injector) { 
   let resolvedProviders = ReflectiveInjector.resolve([KeyValueDiffers]);
   let childInjector = ReflectiveInjector.fromResolvedProviders(resolvedProviders,this.injector);

  let myDiffer : KeyValueDiffers= childInjector.get(KeyValueDiffers);

}

这样,myDiffer将成为一个KeyValueDiffers实例,由Angulars DI实例化,并且myDiffer将在实例化时注入到GSPoint中。

但是,如果您希望以这种方式进行操作,则无论在组件中还是在使用此类的服务中,都必须传递this.myDiffer服务的KeyValueDiffers实例。 (注意:-KeyValueDiffers必须注入您用来创建此GsPoint类对象的组件中)

 import {KeyValueDiffers , Component  } from '@angular/core';
 import {GSPoint} from '../gspoint/gspoint.ts';

 @Component({
    'selector': 'app-sample',
    'templateUrl':'sample.html',
    'styleUrl': 'sample.css'   
  })
 export class Sample {

   constructor(private diff: KeyValueDiffers){

     }
 ngOnInit(){
     let gsPoint = new GSPoint(this.dff); // this is how you can create object
   }   

}