машинопись: вызывать конструктор с простотой введенных параметров - PullRequest
0 голосов
/ 13 сентября 2018

Как создать экземпляр 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);
      });
    }
  }
}

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

То, что вы описываете, это какой-то сервисный локатор.Как правило, я бы не рекомендовал использовать этот подход, потому что вы скрываете зависимости класса от вызывающей стороны и усложняете тестирование.

Если вы все еще хотите реализовать свой путь, ознакомьтесь с этим решением.

0 голосов
/ 13 сентября 2018

если это обычный класс (не компонент или директива), вы не можете внедрить сервис KeyValueDiffers, как мы делаем это на уровне компонентов или на уровне модуля.

1.) Вам нужно

  • добавьте @Injectable () к GsPoint и

  • предоставляет провайдерам, подобным GsPoint: [GsPoint] в компоненте или NgModule.

Когда вы затем внедряете GsPoint куда-то, экземпляр KeyValueDiffers передается в GsPoint, когда он создается DI (до того, как он вводится в первый раз).

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
   }   

}

...