Как таким образом создать экземпляр Point:
let npoint = new 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.info('item changed', item);
});
}
}
}
если это обычный класс (не компонент или директива), то вы не можете внедрить службу 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
}
}
Вы описываете своего рода локатор услуг. Как правило, я бы не рекомендовал использовать этот подход, потому что вы скрываете зависимости классов от вызывающей стороны и потенциально затрудняете тестирование.
Если вы все еще хотите реализовать свой способ, ознакомьтесь с этим решением.