Как пользоваться сервисом в общем классе (Angular 7) - PullRequest
0 голосов
/ 07 мая 2019

У меня есть следующий пример:

Модель данных:

export interface SampleList {
    readonly Id: number;
    CompanyName: string;
    Country: string;
}

Компонент:

export class AppComponent implements OnInit {

  private sampleList = new SampleWrapper<SampleList>();

  constructor() { }

  ngOnInit() {
    this.sampleList.loadData('v_ListOfCompanies');
  }
}

Класс обертки:

export class SampleWrapper<T> {
    public changes: T;
    public original: T;

    private sampleSvc: SampleService;

    constructor() { }

    public loadData(dbView: string) : void {
        this.sampleSvc.getData<T>(dbView)
            .subscribe(
                data => {
                    this.original = data;
                },
                error => {
                    console.log(error);
                }
            );
    }
}

Услуги:

export class SampleService {

  static readonly apiUrl: string = environment.apiUrl;

  constructor(private http: HttpClient) { }

  getData<T>(dbView: string) : Observable<T> {
    const url = `${SampleService.apiUrl}/${dbView}`;

    return this.http.get<T>(url);
  }
}

Сбой http-запросов, потому что sampleSvc не определен.

ОШИБКА TypeError: «this.sampleSvc не определен»

Как я могу использовать ApiService в классе оболочки? Может кто-нибудь мне помочь? Или дайте мне несколько советов по использованию общих классов в машинописи, особенно в Angular 7?

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Вы должны внедрить сервис, используя Dependency injection в конструкторе

 constructor(private sampleSvc: SampleService) { }

, а затем использовать его как,

 this.sampleSvc.getData<T>
0 голосов
/ 07 мая 2019

Вам нужно предоставить свой сервис внутри конструктора

export class SampleWrapper<T> {
    public changes: T;
    public original: T;

    constructor(private sampleSvc: SampleService) { }

    public loadData(dbView: string) : void {
        this.sampleSvc.getData<T>(dbView)
            .subscribe(
                data => {
                    this.original = data;
                },
                error => {
                    console.log(error);
                }
            );
    }
}

И чем вы должны расширить свой класс вместо того, чтобы создавать новый его вариант

export class AppComponent extends SampleWrapper<SampleList> implements OnInit {

  constructor() { }

  ngOnInit() {
    this.loadData('v_ListOfCompanies');
  }
}

Но лучше всего использовать export class SampleWrapper<T> в качестве службы, если этот компонент не имеет никакого представления.

...